Para isso, você deseja
group by
o chart_num e visite. Todas as linhas com o mesmo chart_num e visita aparecerão como uma única linha no resultado. Então você pode sum
o valor recebido, isso somará todos os valores de um grupo. select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
chart_name
é um problema. Você não pode exibi-lo, pois não faz parte do group by
. É uma string, então não faz sentido agregá-la com funções como sum
ou count
. Embora nos dados chart_num tenha o mesmo chart_name, isso não é garantido. Uma solução é usar
group_concat
para concatenar cada nome em um grupo. Deve haver apenas um nome por grupo. 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
No entanto, a solução adequada é corrigir o esquema. chart_name está duplicado, e isso deve ser evitado. Em vez disso, mova as colunas do gráfico para sua própria tabela. Em seguida, para obter o nome do gráfico, junte-se ao 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
Precisamos de uma junção esquerda com a segunda tabela que corresponda ao card_date com a visita. Uma junção à esquerda significa todas as linhas na tabela "esquerda" (ou seja, o
from
table) sempre aparecerá mesmo se não houver correspondência na tabela de junção
. a visita é uma data. card_date não é uma data, mas um carimbo de data/hora. Para combiná-los, precisaremos converter
card_date
a uma data. 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
Precisamos comparar advanced_amount com sum(card_amount_received). Se forem iguais:ok. Se não:erro. No SQL padrão, usaríamos um
case
, mas o MariaDB tem um if
não padrão
que é muito mais compacto. 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