sql >> Databasteknik >  >> RDS >> Mysql

Hur skapar jag en matchning efter att ha jämfört två tabeller?

För detta vill du gruppera efter the chart_num och besök. Alla rader med samma chart_num och besök visas som en enda rad i resultatet. Då kan du summa det mottagna beloppet kommer detta att summera alla värden för en grupp.

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

diagramnamn är ett problem. Du kan inte visa den eftersom den inte ingår i gruppen efter . Det är en sträng så det är inte meningsfullt att aggregera den med funktioner som summa eller count . Även om diagram_num i data har samma diagramnamn, är det inte garanterat.

En lösning är att använda group_concat att sammanfoga varje namn i en grupp. Det ska bara finnas ett namn per grupp.

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 rätta lösningen är dock att fixa schemat. chart_name är duplicerat, och det ska undvikas. Flytta istället diagramkolumnerna till sin egen tabell. Gå sedan med på chart_num för att få diagramnamnet.

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 behöver en vänsteranslutning med det andra bordet som matchar card_date med besöket. En vänsterkoppling betyder alla rader i den "vänstra" tabellen (dvs. från tabell) kommer alltid att visas även om det inte finns någon matchning i kopplingstabellen .

besök är ett datum. card_date är inte ett datum utan en tidsstämpel. För att matcha dem måste vi konvertera card_date till en dejt.

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 måste jämföra advanced_amount med sum(card_amount_received). Om de är lika:ok. Om inte:fel. I standard SQL skulle vi använda ett case , men MariaDB har en icke-standardiserad if det är mycket mer 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. RDBMS vs NoSQL

  2. Skickar användar-ID till PostgreSQL-utlösare

  3. Där resultatuppsättningen lagras när du arbetar med jdbc och oracle-drivrutinen

  4. Jämför två MySQL-databaser