【问题标题】:SQL - Different sum levels in one select with where clauseSQL - 在一个带有 where 子句的选择中不同的总和水平
【发布时间】:2011-03-28 16:48:26
【问题描述】:

我有 2 张桌子。一个具有保持不变的原始数量。第二个表格列出了随着时间推移应用的部分金额与第一个表格中的原始金额相比。

数据库表:

***memotable***
ID [primary, unique]
Amount (Orginal Amount)

***transtable***
ID [many IDs in transtable to single ID in memotable] 
AmountUsed (amount applied)
ApplyDate (date applied)

我想在一次选择中查找 ID、自上周以来使用的金额 (ApplyDate > 2011-04-21)、迄今为止使用的金额。

应该出现在结果中的唯一行是自上周以来使用的金额(ApplyDate > 2011-04-21)。

我一直在尝试获取迄今为止使用的金额的总和,因为这需要包括 ApplyDate > 2011-04-21 之外的 AmountUsed 值。

【问题讨论】:

  • SELECT A.ID, A.Amount, SUM(B.AmountUsed) AS AmountUsedWeek, (SELECT SUM(B.AmountUsed) AS AmountUSEdTotal FROM transtable C WHERE A.ID = C.ID) FROM memotable A,transtable B WHERE B.ApplyDate > '2011-02-07' AND A.ID = B.D GROUP BY A.ID, A.Amount

标签: sql select sum


【解决方案1】:

在这种情况下可以避免子选择:

SELECT
  ID,
  AmountUsedSinceLastWeek = SUM(CASE WHEN ApplyDate > '4/21/2011' THEN AmountUsed END)
  AmountUsedToDate = SUM(AmountUsed)
FROM TransTable
GROUP BY ID

【讨论】:

  • 我认为这会给我额外的行(那些
  • @brennt:对不起,我不关注。 AmountUsedToDate = SUM(AmountUsed) – 我认为这是对所有行求和。或者你是什么意思?
  • 您的解决方案是正确的。它仅正确显示了过去一周应用金额的行,同时还显示了总体总数。我只是想知道它为什么这样做,而不是一直显示所有行。
  • @brennt:部分总和是在 CASE 的帮助下计算的。所以这个查询中的第一个 SUM 不是直接应用于AmountUsed 列,而是应用于 CASE 表达式的结果。并且 CASE 表达式仅返回 AmountUsed 的那些值,其对应的 ApplyDate 值是“2011 年 4 月 21 日”之后的日期,否则返回 NULL(被 SUM 忽略)。如果您在没有分组和聚合的情况下运行此查询,您将能够看到“原始”数据,因此您将亲自看到 CASE 表达式在做什么。
【解决方案2】:

由于您想将其限制为自上周以来发生的行,但还想包括迄今为止的总数,我认为最有效的方法是使用子选择...

SELECT
    lastWeek.ID,
    lastWeek.AmountUsedSinceLastWeek,
    toDate.AmountUsedToDate
FROM
(
    SELECT
        ID,
        SUM(AmountUsed) AS AmountUsedSinceLastWeek
    FROM TransTable
    WHERE ApplyDate > '4/21/2011'
    GROUP BY ID
) lastWeek JOIN
(
    SELECT
        ID,
        SUM(AmountUsed) AS AmountUsedToDate
    FROM TransTable
    GROUP BY ID
) toDate ON lastWeek.ID = toDate.ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多