【问题标题】:how to substract two sums based on different field values in one table (view)如何根据一个表中的不同字段值减去两个总和(视图)
【发布时间】:2012-10-16 10:48:18
【问题描述】:

示例:我需要其中 id = 1 的金额之和不等于 id 1 的金额之和的数字,以及 id 和差异。
表格(本例中的视图)可能如下所示:

NUMBER   AMOUNT   ID

0001     500       1
0001     500       2
0002     400       3
0003     299       1
0003     300       3
0003     300       3

非常感谢您在这方面的帮助。

【问题讨论】:

  • 你在使用什么 rdbms?如果是sql server,是什么版本?
  • What have you tried,你想要的结果是什么?
  • sqlserver 2000 我尝试使用别名在同一个表上使用连接
  • 结果可能如下所示:数字 0002 差异 400

标签: sql tsql sql-server-2000


【解决方案1】:

使用此查询,您可以获得按数字分组的金额总和,ID 等于 1,ID 不等于 1。

SELECT NUMBER
, SUM(CASE WHEN ID = 1 THEN AMOUNT ELSE 0 END) AS Equals1
, SUM(CASE WHEN ID <> 1 THEN AMOUNT ELSE 0 END) AS NotEquals1
FROM DataTable
GROUP BY NUMBER 

如果这是您的预期,请使用以下查询来获取按数字分组的差额。

SELECT NUMBER, (Equals1 - NotEquals1) AS DifferenceAmount
FROM
(
    SELECT NUMBER
    , SUM(CASE WHEN ID = 1 THEN AMOUNT ELSE 0 END) AS Equals1
    , SUM(CASE WHEN ID <> 1 THEN AMOUNT ELSE 0 END) AS NotEquals1
    FROM DataTable
    GROUP BY NUMBER
) AS GroupedTable
WHERE Equals1 <> NotEquals1

【讨论】:

  • 感谢您的快速反应,@Prassana 答案在我的情况下效果最好,我只想在结果中添加一个更多信息(日期)字段。如何在不改变结果的情况下做到这一点?
  • 对不起,我在上面的评论中拼错了你的名字
  • 如果您还需要按日期分组,请将其放在 SELECT 和 GROUP BY 中
【解决方案2】:
SELECT
    MyView.Number,
    MyView.Amount - D.OverOneTotal AS Difference
FROM
    MyView
    LEFT JOIN 
    (SELECT
        Number,
        SUM(Amount) OverOneTotal
    FROM
        MyView
    WHERE
        ID > 1
    GROUP BY 
        Number) D ON MyView.Number = D.Number
WHERE
    MyView.ID = 1
    AND MyView.Amount <> D.OverOneTotal 

【讨论】:

  • 你为什么用LEFT JOIN而不是INNER JOIN
  • @AndriyM 如果是INNER JOIN,则结果中将省略所有只有一条记录的数字。
  • 我明白了,谢谢。我认为显示该行没有任何意义,尽管这当然只是我对问题的(可能不正确的)解释。但是,您的查询无论如何都不会显示那条孤独的记录,因为您的 WHERE 子句(尤其是 MyView.Amount &lt;&gt; D.OverOneTotal 部分)有效地将您的左连接变成了内连接。
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
相关资源
最近更新 更多