Sql для подсчета сумм и добавления сумм из 2 таблиц

Я получаю последний sql для работы.

Первые две группы дали мне правильный ответ, но последний, который включает объединение двух таблиц, дал мне слишком высокий номер, когда я вручную добавлял первые два вместе.

sql - генерировать цифры 1,2 и (1 + 2) как 3.

Помощь Pls. sql ниже....

select [OrderDate] as "Date", 
 'Cobs' as "Payment Source", 
 COUNT(*) as "Quantity", 
 SUM([Amount]) as "Value in Pounds"
from cobaltins
where PN like 'BT%'
group by OrderDate

union all

select [OrderDate] as "Date", 
 'Cobs Adhoc' as "Payment Source",
 COUNT(*) as "Quantity", 
 SUM([Amount]) as "Value in Pounds"
FROM cobaltins_adhoc
where name = 'Vauz'
group by OrderDate

union all

select cba.OrderDate as "Date", 
 'Cumulative' as "Payment Source",
 COUNT(*) as "Quantity", 
 sum((cb.Amount)+(cba.Amount)) as "Value in Pounds"
FROM cobaltins as cb 
left join cobaltins_adhoc as cba on cb.OrderDate = cba.OrderDate
where cb.PN like 'BT%' 
 or cba.name = 'Vauz'
group by cba.OrderDate
4 ответа

Вместо того, чтобы попробовать и получить его в одном, вы можете попытаться суммировать встроенный просмотр вашего UNION

SELECT 
 "Date", 
 "Payment Source", 
 SUM(Quantity) Quantity,
 SUM("Value in Pounds") "Value in Pounds"
 FROM 
(
 select [OrderDate] as "Date",
 'Cobs' as "Payment Source", 
 COUNT(*) as "Quantity",
 SUM([Amount]) as "Value in Pounds"
 from cobaltins
 where PN like 'BT%'
 group by OrderDate

 union all

 select [OrderDate] as "Date", '
 Cobs Adhoc' as "Payment Source",COUNT(*) as "Quantity", 
 SUM([Amount]) as "Value in Pounds"
 FROM cobaltins_adhoc
 where name = 'Vauz'
 group by OrderDate
) t 
GROUP BY 
 "Date", 
 "Payment Source"


Вы присоединяетесь к OrderDate.

Это означает, что если в одной таблице указано более одной строки с одинаковой датой заказа, тогда вы получите дублирование совпадающих строк в другой таблице.

Быстрый способ проверить это - удалить COUNT (*) и GROUP BY, и просто посмотреть на результат вашего соединения. Вы видите дубликаты, которые вы не хотели считать?


То, как вы делаете свое соединение

FROM cobaltins as cb
LEFT JOIN cobaltins_adhoc as cba
ON cb.OrderDate = cba.OrderDate

присоединяется только к дате заказа. если у вас несколько заказов на дату, тогда он попытается объединить их вместе произвольно. вам нужно добавить что-то еще в это соединение, чтобы сделать его отличным.


Почему бы не сделать это со столбцами вместо строк?

select bt."Date", bt.Quantity as Cobs, vauz.Quantity as CobsAdhoc,
 (bt.quantity + coalesce(vauz.Quantity)) as Total
from (select [OrderDate] as "Date", 'Cobs' as "Payment Source", COUNT(*) as "Quantity",
 SUM([Amount]) as "Value in Pounds"
 from cobaltins
 where PN like 'BT%'
 group by OrderDate
 ) bt left outer join
 (select [OrderDate] as "Date", 'Cobs Adhoc' as "Payment Source",COUNT(*) as "Quantity", 
 SUM([Amount]) as "Value in Pounds"
 FROM cobaltins_adhoc
 where name = 'Vauz'
 group by OrderDate
 ) vauz
 on bt."Date" = vauz."Date";

licensed under cc by-sa 3.0 with attribution.