2013-08-22 117 views
2

我想在调整docBal之后获得每个公司的总和(docBal)。但是当我运行下面的查询时,我不得不在docby中包含doctype和docbal-我不想要。我怎样才能修改这个查询?如何汇总表达式的结果?

select 
    DocBal = CASE d.DocType WHEN 'AD' THEN -d.DocBal 
          ELSE d.DocBal END, 
    Sum(DocBal) 
    from Vendor v 
    inner join APDoc d 
    on v.VendId = d.VendId 
    where 
     d.PerPost = 201307 
     and d.DocType in ('VO','AP','AD') 
     and d.OpenDoc = 1 
     and Acct = 210110 
    group by CpnyID 
+0

难道你不想公开'CpnyID'吗?否则 - 如果你使用“CpnyID”分组 - 你怎么知道哪个'SUM'属于哪个'CpnyID'?你能否展示一些样本数据(包括所有可能的边缘案例)和期望的结果,所以人们不必猜测你的查询实际上正在做什么? –

回答

1
select sum(DocBal) FROM 
(select 
    DocBal = CASE d.DocType WHEN 'AD' THEN -d.DocBal 
          ELSE d.DocBal END, 
    CpnID 
    from Vendor v 
    inner join APDoc d 
    on v.VendId = d.VendId 
    where 
     d.PerPost = 201307 
     and d.DocType in ('VO','AP','AD') 
     and d.OpenDoc = 1 
     and Acct = 210110) a 
GROUP BY CpnID 
0
select sum(DocBal) from (
     select 
      DocBal = CASE d.DocType WHEN 'AD' THEN -d.DocBal 
            ELSE d.DocBal END, 
      CpnyID 
      from Vendor v 
      inner join APDoc d 
      on v.VendId = d.VendId 
      where 
       d.PerPost = 201307 
       and d.DocType in ('VO','AP','AD') 
       and d.OpenDoc = 1 
       and Acct = 210110 
    ) 
    group by CpnyID 
2

您可以使用子选择捕捉您所需要的信息。

SELECT S.CpnyID, 
      SUM(S.DocBal) 
    FROM (
      SELECT CpnyID, 
        CASE d.DocType WHEN 'AD' THEN -d.DocBal ELSE d.DocBal END AS DocBal 
      FROM Vendor v 
        INNER JOIN APDoc d ON v.VendId = d.VendId 
      WHERE  d.PerPost = 201307 
      AND d.DocType in ('VO','AP','AD') 
      AND d.OpenDoc = 1 
      AND Acct = 210110 
    ) AS S 
    GROUP BY S.CpnyID 

这应该为您提供所需的数据,而不必在聚合函数中包含额外的列。

2

你不是在说你正在使用什么SQL产品(以及哪个版本)。这是事实,那其他人所说的派生表的解决方案将在任何产品的工作,但如果您正在使用SQL Server 2005或更高版本的工作,你也可以使用CROSS APPLY,像这样:

SELECT 
    CpnyID, -- assuming you would like to know which SUM() belongs to which CpnyID 
    SUM(x.DocBal) 
FROM Vendor AS v 
INNER JOIN APDoc AS d ON v.VendId = d.VendId 
CROSS APPLY ( SELECT DocBal = CASE d.DocType WHEN 'AD' THEN -d.DocBal ELSE d.DocBal END ) AS x 
WHERE d.PerPost = 201307 
    AND d.DocType in ('VO','AP','AD') 
    AND d.OpenDoc = 1 
    AND Acct = 210110 
GROUP BY 
    CpnyID 
;

有在我看来,解决方案也简单得多:你可以使整个CASE表达式成为SUM的参数,如下所示:

SELECT 
    CpnyID, 
    SUM(CASE d.DocType WHEN 'AD' THEN -d.DocBal ELSE d.DocBal END) 
FROM Vendor AS v 
INNER JOIN APDoc AS d ON v.VendId = d.VendId 
WHERE d.PerPost = 201307 
    AND d.DocType in ('VO','AP','AD') 
    AND d.OpenDoc = 1 
    AND Acct = 210110 
GROUP BY 
    CpnyID 
;