如何在子查询中使用多个sum和group by?

时间:2017-03-04 08:56:41

标签: sql sql-server group-by

ER DIAGRAM SNAP必须查找每年2种订单的订单金额总计。 table是SalesOrderHeader 小计+ TaxAmt给出总订单金额
OnlineOrderFlag(0/1分别是直接/在线)

1>以下列格式显示结果

OrderYear         Direct              Online

2001                 75423               344344

2002            
2003        
2004        

SQL:

select year(a.OrderDate),

( select  SUM(SubTotal+TaxAmt) FROM SalesOrderHeader b  WHERE OnlineOrderFlag = 0 group by year(b.OrderDate) ) as tot  ,

( select SUM(SubTotal+TaxAmt) FROM SalesOrderHeader c WHERE OnlineOrderFlag = 1 group by year(c.OrderDate) ) as tt

FROM SalesOrderHeader a inner join  SalesOrderHeader b 
on b.SalesOrderID = a.SalesOrderID
            inner join
   SalesOrderHeader c on c.SalesOrderID = a.SalesOrderID

有人可以请电话如何进一步处理?我被困在这个

2 - ;以及如何以下面的格式找到它?

OnlineFlag               Year                    TotalAmt
Direct                   2001    
Direct                   2002    
Direct                   2003    
Direct                   2004    
Online                   2001    
Online                   2002    
Online                   2003    
Online                   2004    

2 个答案:

答案 0 :(得分:1)

这应该有效。添加内部子查询以明确需要去的组的位置,并在汇总之前为每条记录添加小计和税。

select a.year
      ,SUM(Case when a.OnlineOrderFlag = 1 THEN a.total else null end) as Direct
      ,SUM(Case when a.OnlineOrderFlag = 0 THEN a.total else null end) as Online
FROM (select year(OrderDate) as year, (SubTotal+TaxAmt) as total, OnlineOrderFlag
      from SalesOrderHeader) a
Group by a.year

答案 1 :(得分:0)

SELECT YEAR(ORDERDATE), ONLINEORDERFLAG,
        SUM(SUBTOTAL) SUBTOTAL,SUM(TAXAMT) TAXAMT,
        SUM(SUBTOTAL + TAXAMT) TOTALDUE
FROM SALESORDERHEADER
WHERE ONLINEORDERFLAG = 1
GROUP BY YEAR(ORDERDATE) WITH ROLLUP
UNION
SELECT YEAR(ORDERDATE), ONLINEORDERFLAG,
        SUM(SUBTOTAL) ,SUM(TAXAMT),
        SUM(SUBTOTAL + TAXAMT)
FROM SALESORDERHEADER
WHERE ONLINEORDERFLAG = 0
GROUP BY YEAR(ORDERDATE) WITH ROLLUP
;