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