Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да изведа съвпадение след сравняване на две таблици?

За това искате да group by номер на диаграмата и посещение. Всички редове със същия chart_num и посещение ще се покажат като един ред в резултата. След това можете да sum получената сума, това ще сумира всички стойности за група.

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

chart_name е проблем. Не можете да го покажете, тъй като не е част от group by . Това е низ, така че няма смисъл да го агрегирате с функции като sum или count . Въпреки че в данните chart_num има същото име на диаграма, това не е гарантирано.

Едно решение е да използвате group_concat за да свържете всяко име в група заедно. Трябва да има само едно име на група.

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

Въпреки това, правилното решение е да коригирате схемата. chart_name се дублира и това трябва да се избягва. Вместо това преместете колоните на диаграмата в тяхната собствена таблица. След това, за да получите името на диаграмата, присъединете се към 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

Имаме нужда от ляво присъединяване с втората таблица, съответстваща на card_date с посещението. Ляво свързване означава всички редове в "лявата" таблица (т.е. from таблица) винаги ще се показва, дори ако няма съвпадение в таблицата за присъединяване .

посещението е среща. card_date не е дата, а времеви печат. За да ги съпоставим, ще трябва да преобразуваме card_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

Трябва да сравним advanced_amount със sum(card_amount_received). Ако са равни:добре. Ако не:грешка. В стандартния SQL бихме използвали case , но MariaDB има нестандартен if това е много по-компактно.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Задаване на двоични данни с помощта на setblob в mysql конектор/c++ причинява срив

  2. Зареждане на UTF-8 кодиран дъмп в MySQL

  3. Има ли начин да видите подготвена заявка, тъй като тя ще бъде изпълнена в базата данни?

  4. Подобрете производителността на MySQL заявка за пълнотекстово търсене

  5. Използвайте заявка в стил SQL в Excel с помощта на VBA