sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo obtengo una coincidencia después de comparar dos tablas?

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