sql对两个表中的计数求和并添加金额

sql对两个表中的计数求和并添加金额,sql,Sql,我正在使用最后一个sql 前两个分组给了我正确的答案,但最后一个涉及连接两个表的分组给了我一个太高的数字,当我手动将前两个加在一起时 sql将生成图1,2和(1+2)作为3 请帮忙。 下面是sql select [OrderDate] as "Date", 'Cobs' as "Payment Source", COUNT(*) as "Quantity", SUM([

我正在使用最后一个sql

前两个分组给了我正确的答案,但最后一个涉及连接两个表的分组给了我一个太高的数字,当我手动将前两个加在一起时

sql将生成图1,2和(1+2)作为3

请帮忙。 下面是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

你加入的方式

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

仅在订单日期加入。如果你每个日期有多个订单,那么它会尝试将这些订单任意地连接在一起。您需要在该加入中添加其他内容以使其与众不同。

您是在OrderDate加入的

这意味着,如果两个表中有多个具有相同订单日期的行,那么您将获得另一个表中匹配行的重复


测试这一点的一种快速方法是删除COUNT(*)和GROUP BY,只需查看加入的结果。您是否看到任何不想计数的重复项?

为什么不使用列而不是行来执行此操作

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";

你可能想尝试对你的工会的内联视图求和,而不是尝试将其加入其中

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"

我突然想到的一件事是下面的左连接。我不太确定这些表是什么,但它是否会保留太多的值,并通过计算两次来扭曲结果?也许内部联接更合适?您使用的是什么数据库?这两个表没有其他共同点..我只想得到每个表和计数所赚的2元钱的总和..在这种情况下,我建议使用Conrad Frix的上述答案,它将这两个作为子查询,然后聚合它们的值。因为这将允许您仅获取所需的单个值,而不是使用join重复值。