Para esto, desea group by
el chart_num y visit. Todas las filas con el mismo chart_num y visita aparecerán como una sola fila en el resultado. Luego puede sum
la cantidad recibida, esto sumará todos los valores para un grupo.
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
chart_name
es un problema. No puede mostrarlo ya que no es parte del group by
. Es una cadena, por lo que no tiene sentido agregarla con funciones como sum
o count
. Aunque en los datos chart_num tiene el mismo chart_name, eso no está garantizado.
Una solución es usar group_concat
para concatenar cada nombre en un grupo juntos. Solo debe haber un nombre 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
Sin embargo, la solución adecuada es arreglar el esquema. chart_name está duplicado, y eso debe evitarse. En su lugar, mueva las columnas del gráfico a su propia tabla. Luego, para obtener el nombre del gráfico, únase a 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
Necesitamos una combinación izquierda con la segunda tabla que coincida con card_date con la visita. Una combinación izquierda significa todas las filas en la tabla "izquierda" (es decir, el from
tabla) siempre aparecerá incluso si no hay ninguna coincidencia en la tabla de unión
.
La visita es una cita. card_date no es una fecha sino una marca de tiempo. Para hacerlos coincidir, necesitaremos convertir card_date
a una fecha.
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
Necesitamos comparar advanced_amount con sum(card_amount_received). Si son iguales:ok. Si no:error. En SQL estándar, usaríamos un case
, pero MariaDB tiene un if
no estándar
eso es mucho más 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