Как мне объединить и суммировать значения в 3 таблицах, где мне нужно сгруппировать по одному ключевому столбцу

#sql-server #tsql

#sql-server #tsql

Вопрос:

Я пытаюсь объединить 3 таблицы (TableA, TableB, TableC), во всех из которых есть 3 поля (invoice, ProductClass, value).TableA и TableB не имеют значений в поле ProductClass, а TableC не имеет значений в поле Value. Все таблицы имеют общее значение Invoice, но разные ProductClass, и результат должен суммировать значения на основе invoices и ProductClass

 create table tableA (
    Invoice varchar(100),
    ProductClass varchar(100),
    Value int
)
create table tableB (
    Invoice varchar(100),
    ProductClass varchar(100),
    Value int
)
create table tableC (
    Invoice varchar(100),
    ProductClass varchar(100),
    Value int
)

insert into tableA
values
('001','',10),
('002','',20),
('003','',30),
('004','',40)


insert into tableB
values
('001','',20),
('002','',30),
('003','',40),
('004','',50)


insert into tableC
values
('001','aaa',null),
('002','aab',null),
('003','aac',null),
('004','aad',null)



select Invoice,ProductClass,sum(Value)
from(
    select * from tableA
    union
    select * from tableB
    union
    select * from tableC
)tableD
group by Invoice,ProductClass
  

я ожидаю, что результаты вернутся

 Invoice - 001,002,003,004
ProductClass - aaa,aab,aac,aad
Value - 30,50,70,90
  

Ответ №1:

Вы можете использовать max() for ProductClass , если оно имеет значение типа blank или null s:

 select Invoice, max(ProductClass) as ProductClass, sum(Value) as Value
from(select * from tableA
     union
     select * from tableB
     union
     select * from tableC
    )tableD
group by Invoice;
  

Комментарии:

1. У ProductClass нет пустых или нулевых значений, проверьте таблицу в примере кода, который я опубликовал

2. @Ronald . . Да, tableC у меня нет null или blank , но в первых двух таблицах есть это. Итак, если вы используете этот столбец в GROUP BY , он будет рассматриваться как отдельная группа, т.е. ( blank ). Итак, для этого ваш результат был бы прекрасен. Если вам нужна одна группа, тогда используйте max() in ProductClass .