sql >> Database teknologi >  >> RDS >> Mysql

Hvordan udskriver jeg et match efter at have sammenlignet to tabeller?

Til dette ønsker du at gruppere efter chart_num og besøg. Alle rækker med samme chart_num og besøg vises som en enkelt række i resultatet. Så kan du sum det modtagne beløb, vil dette summere alle værdierne for en gruppe.

select
  chart_num,
  visit,
  sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit

diagramnavn er et problem. Du kan ikke vise det, da det ikke er en del af gruppe efter . Det er en streng, så det giver ikke mening at aggregere den med funktioner som sum eller count . Selvom chart_num i dataene har det samme chart_name, er det ikke garanteret.

En løsning er at bruge group_concat at sammenkæde hvert navn i en gruppe. Der bør kun være ét navn pr. gruppe.

select
  chart_num,
  visit,
  group_concat(chart_name) as chart_name,
  sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit

Den rigtige løsning er dog at rette skemaet. chart_name er duplikeret, og det skal undgås. Flyt i stedet diagramkolonnerne til deres egen tabel. For at få diagramnavnet skal du deltage på chart_num.

create table charts (
  id serial primary key,
  name varchar(255) not null
);

insert into charts (id, name) values
  (4, 'user1'), (5, 'user2'), (6, 'user3'), (7, 'user4');

alter table table1 drop column chart_name;

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received
from table1
join charts on charts.id = chart_num
group by chart_num, visit

Vi har brug for en venstre join med det andet bord, der matcher card_date med besøget. En venstre join betyder alle rækkerne i tabellen "venstre" (dvs. fra tabel) vises altid, selvom der ikke er noget match i join-tabellen .

besøg er en dato. card_date er ikke en dato, men et tidsstempel. For at matche dem skal vi konvertere card_date til en date.

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received,
  table2.card_date,
  table2.advanced_amount as amount
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit

Vi skal sammenligne advanced_amount med sum(card_amount_received). Hvis de er lige:ok. Hvis ikke:fejl. I standard SQL ville vi bruge en case , men MariaDB har en ikke-standardiseret if det er meget mere kompakt.

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received,
  table2.card_date,
  table2.advanced_amount as amount,
  if(table2.advanced_amount = sum(card_amount_received), 'ok', 'error') as result
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit



  1. SQL-forespørgsel for at slette tabel i MySQL

  2. Hvornår skal jeg bruge CROSS APPLY over INNER JOIN?

  3. Sådan implementeres Percona XtraDB Cluster 8 for høj tilgængelighed

  4. Sammenligning af høj tilgængelighed af databaser - MySQL / MariaDB-replikering vs Oracle Data Guard