2016-09-22 80 views
-1

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

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

哪些DBMS您使用的是什么?这是非标准的语法。 –

+0

你不能在case语句中放置子查询。显示整个SQL查询,我们可以修复它。 –

+0

@CharlesBretana至少在sql-server中,你绝对可以把一个子查询放入一个case表达式中,我只是测试了一下以确保。不是我一定会推荐它,虽然 – Matt

回答

0

我很好奇,因为我从来没有试过SUM子查询。我不会建议它,但我尽量避免每行应用的子查询(例如列定义)。无论如何,你可以弄清楚如何与我们的连接,你可以将你的情况下表达于外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条件被添加在你的WHERE外的子查询的条件适用

而且我假定SQL-SERVER,由于您使用的格式()