sql >> Databáze >  >> RDS >> Mysql

Jak vygeneruji shodu po porovnání dvou tabulek?

Chcete-li to provést, group by chart_num a visit. Všechny řádky se stejným číslem grafu a návštěvou se ve výsledku zobrazí jako jeden řádek. Poté můžete sum přijaté částky, tím se sečtou všechny hodnoty pro skupinu.

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

chart_name je problém. Nemůžete jej zobrazit, protože není součástí group by . Je to řetězec, takže nemá smysl jej agregovat s funkcemi jako sum nebo count . Ačkoli má v datech chart_num stejný název_chartu, není to zaručeno.

Jedním z řešení je použít group_concat zřetězit každé jméno ve skupině dohromady. Každá skupina by měla mít pouze jedno jméno.

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

Správným řešením je však opravit schéma. chart_name je duplicitní a tomu je třeba se vyhnout. Místo toho přesuňte sloupce grafu do jejich vlastní tabulky. Poté, abyste získali název grafu, připojte se k 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

Potřebujeme levé spojení s druhým stolem, které odpovídá card_date návštěvě. Spojení vlevo znamená všechny řádky v tabulce „vlevo“ (tj. from tabulka) se zobrazí vždy, i když v tabulce spojení není žádná shoda .

návštěva je rande. card_date není datum, ale časové razítko. Abychom jim odpovídali, budeme muset převést card_date na rande.

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

Musíme porovnat pokročilou_částku se součtem(přijatá_částka_karty). Pokud jsou si rovni:ok. Pokud ne:chyba. Ve standardním SQL bychom použili case , ale MariaDB má nestandardní if to je mnohem kompaktnější.

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. Nejlepší způsob, jak zabezpečit SQL dotaz v PHP

  2. Hledání fulltextového booleovského režimu MySQL vrací příliš mnoho výsledků

  3. Funkce SUM() v MariaDB

  4. Závažná chyba:Volání nedefinované funkce sqlsrv_connect()