SQL总结子查询

时间:2016-09-22 20:48:12

标签: sql subquery aggregate

我试图总结一个子查询,但不知道如何重写它:

FORMAT(
SUM(
   CASE WHEN SOH.LASDLVNUM_0 <> '' 
           AND SOH.LASINVNUM_0 <> '' 
           AND MONTH(SOH.SHIDAT_0) = MONTH(GETDATE()) 
        THEN 
           (Select (SID.NETPRI_0) 
            from x3v6.CICPROD.SINVOICED SID 
            where SID.NUM_0 = SOH.LASINVNUM_0 
              and SID.ITMREF_0 = SOQ.ITMREF_0 
              and SID.STOFCY_0 = SOQ.STOFCY_0) 
          * SOQ.INVQTY_0 * SOH.CHGRAT_0 
        ELSE 0.00 END), 
       '##,##0.00') as 'Invoiced (MTD)',

未收到错误消息“无法对包含聚合或子查询的表达式执行聚合函数。”

1 个答案:

答案 0 :(得分:0)

我很好奇,因为我从未尝试过SUM子查询。我不建议它,但我尽量远离每行应用的子查询(例如列定义)。无论如何,你可以弄清楚如何用连接来解决你可以将你的case表达式移动到OUTER APPLY以及一​​些基本上允许你聚合子查询的东西......

DECLARE @Table AS TABLE (Id INT IDENTITY(1,1), Criteria INT, Criteria2 INT)
DECLARE @OtherTable AS TABLE (TID INT)
INSERT INTO @Table VALUES (1,1),(2,2),(3,3),(4,4)
INSERT INTO @OtherTable  VALUES (1),(1),(2),(2),(3),(3),(4),(4)

SELECT
    t.Id
    ,SUM(COALESCE(oa.Value,0))
FROM
    @Table t
    OUTER APPLY (SELECT
                TID as Value
             FROM
                @OtherTable ot
             WHERE
                ot.TID = t.Id
                AND t.Criteria  % 2 = 0
                AND t.Criteria2 % 2 = 0) oa
GROUP BY
    t.Id

请注意,当您使用此方法时,技巧是WHEN条件被添加到OUTER APPLY中的子查询的WHERE条件

由于您使用了FORMAT()

,我也假设了SQL-SERVER