Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wyświetlić dopasowanie po porównaniu dwóch tabel?

W tym celu chcesz group by chart_num i wizyta. Wszystkie wiersze z tym samym numerem wykresu i wizytą pojawią się w wyniku jako pojedynczy wiersz. Następnie możesz sum otrzymanej kwoty, to zsumuje wszystkie wartości dla grupy.

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

chart_name jest problem. Nie możesz go wyświetlić, ponieważ nie należy do grupy group by . Jest to ciąg, więc nie ma sensu agregować go za pomocą funkcji takich jak sum lub count . Chociaż w danych numer_wykresu ma tę samą nazwę_wykresu, nie jest to gwarantowane.

Jednym z rozwiązań jest użycie group_concat połączyć ze sobą każde imię w grupie. Każda grupa powinna mieć tylko jedną nazwę.

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

Jednak właściwym rozwiązaniem jest naprawienie schematu. chart_name jest zduplikowany i należy tego unikać. Zamiast tego przenieś kolumny wykresu do ich własnej tabeli. Następnie, aby uzyskać nazwę wykresu, dołącz do wykresu.

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

Potrzebujemy left join z drugą tabelą pasującą card_date do wizyty. Lewe sprzężenie oznacza wszystkie wiersze w „lewej” tabeli (tj. from table) zawsze pojawi się, nawet jeśli nie ma dopasowania w tabeli dołączania .

wizyta to randka. card_date nie jest datą, ale znacznikiem czasu. Aby je dopasować, musimy przekonwertować card_date na randkę.

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

Musimy porównać advanced_amount z sum(card_amount_received). Jeśli są równe:ok. Jeśli nie:błąd. W standardowym SQL użylibyśmy case , ale MariaDB ma niestandardowy if to jest znacznie bardziej kompaktowe.

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. Wybierz ostatni wiersz z GROUP BY w MySQL

  2. Nielegalna mieszanka błędów sortowania w MySql

  3. jak sprawić, by minutnik nie resetował się podczas odświeżania strony

  4. nie wolno zwracać zestawu wyników z wyzwalacza mysql

  5. Relacja Doctrine2 ManyToMany nie zapisuje