sql >> Database >  >> RDS >> Mysql

Hoe voer ik een match uit na het vergelijken van twee tabellen?

Hiervoor wil je group by de chart_num en bezoek. Alle rijen met hetzelfde chart_num en bezoek verschijnen als een enkele rij in het resultaat. Dan kun je sum het ontvangen bedrag, dit telt alle waarden voor een groep op.

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

chart_name is een probleem. Je kunt het niet weergeven omdat het geen deel uitmaakt van de group by . Het is een string, dus het heeft geen zin om het te aggregeren met functies zoals sum of count . Hoewel chart_num in de data dezelfde chart_name heeft, is dat niet gegarandeerd.

Een oplossing is om group_concat te gebruiken om elke naam in een groep samen te voegen. Er mag maar één naam per groep zijn.

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

De juiste oplossing is echter het schema te repareren. chart_name wordt gedupliceerd, en dat moet worden vermeden. Verplaats in plaats daarvan de diagramkolommen naar hun eigen tabel. Om de naam van de kaart te krijgen, moet je lid worden van het 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

We hebben een left join nodig met de tweede tafel die overeenkomt met de card_date met het bezoek. Een left join betekent alle rijen in de "linker" tabel (dwz de from table) zal altijd verschijnen, zelfs als er geen match is in de join-tabel .

bezoek is een datum. card_date is geen datum maar een tijdstempel. Om ze te matchen, moeten we card_date . converteren tot een datum.

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

We moeten advanced_amount vergelijken met sum(card_amount_received). Als ze gelijk zijn:ok. Zo niet:fout. In standaard SQL zouden we een case gebruiken , maar MariaDB heeft een niet-standaard if dat is veel compacter.

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. Wat is de equivalente PostgreSQL-syntaxis voor CONNECT BY... START WITH van Oracle?

  2. sql cross join - wat voor nut heeft iemand er voor gevonden?

  3. Hoe op te lossen dat de coderingsfout niet kan worden gewijzigd bij het invoegen van XML in SQL Server

  4. SQL-foutmelding weergeven