2

在调整 docBal 后,我试图获得每家公司的总和(docBal)。但是当我运行下面的查询时,我被迫在 groupby 中包含 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
4

4 回答 4

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

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

于 2013-08-22T15:42:39.363 回答
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
;
于 2013-08-22T19:28:02.173 回答
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
于 2013-08-22T15:36:45.203 回答
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
于 2013-08-22T15:35:30.873 回答