Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment afficher une correspondance après avoir comparé deux tables ?

Pour cela, vous voulez group by le chart_num et la visite. Toutes les lignes avec le même chart_num et la même visite apparaîtront comme une seule ligne dans le résultat. Ensuite, vous pouvez sum le montant reçu, cela additionnera toutes les valeurs pour un groupe.

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

chart_name est un problème. Vous ne pouvez pas l'afficher car il ne fait pas partie du group by . C'est une chaîne donc ça n'a pas de sens de l'agréger avec des fonctions comme sum ou count . Bien que dans les données chart_num ait le même chart_name, cela n'est pas garanti.

Une solution consiste à utiliser group_concat pour concaténer chaque nom dans un groupe ensemble. Il ne devrait y avoir qu'un seul nom par groupe.

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

Cependant, la bonne solution est de corriger le schéma. chart_name est dupliqué, et c'est à éviter. Au lieu de cela, déplacez les colonnes du graphique dans leur propre tableau. Ensuite, pour obtenir le nom du graphique, rejoignez le 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

Nous avons besoin d'une jointure gauche avec la deuxième table correspondant au card_date avec la visite. Une jointure gauche signifie toutes les lignes de la table "gauche" (c'est-à-dire le from table) apparaîtra toujours même s'il n'y a pas de correspondance dans la table de jointure .

la visite est un rendez-vous. card_date n'est pas une date mais un horodatage. Pour les faire correspondre, nous devrons convertir card_date à une 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

Nous devons comparer advanced_amount avec sum(card_amount_received). S'ils sont égaux :ok. Sinon :erreur. En SQL standard, nous utiliserions un case , mais MariaDB a un if non standard c'est beaucoup plus compact.

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