SQL - 查询以在每个ID的特定值之后对值求和

时间:2016-04-26 14:00:42

标签: sql sql-server-2012

我在查询时遇到了一些麻烦。对于每个ID,我想对在不同列中的最后一个值之后出现的值求和。

数据库看起来像这样但没有计数值旁边的注释:

ID _____日期______金额_____计数

8 ____ 2016-04-20 ____ 300________500 (自上次统计以来)

8 ____ 2016-04-21 ____ 100________100 (自上次计算以来,该行只有100个)

8 ____ 2016年4月22日____ 200 ________ 0

8 ____ 2016年4月23日____ 300 ________ 0

8 ____ 2016-04-24 ____ 400________900 (自上次计数:400 + 300 + 200)

8 ____ 2016年4月25日____的 300 ________ 0

112__2016-04-20 ____ 100 ________ 0

112__2016-04-21 ____ 100________500 (自上次统计以来)

112__2016-04-22 ____的 200 ________ 0

112__2016-04-23 ____的 200 ________ 0

112__2016-04-24 ____的 200 ________ 0

112__2016-04-25 ____的 400 ________ 0

333__2016-04-20 ____ 700________1000 (自上次统计以来)

333__2016-04-21 ____ 400 ________ 0

333__2016-04-22 ____ 200 ________ 0

333__2016-04-23 ____ 200 ________ 0

333__2016-04-24 ____ 200 ________ 0

333__2016-04-25 ____ 400________1400 *(自上次统计以来,400 + 200 + 200 + 200 + 400)

我想总结一下粗体值,因为它们尚未添加到计数中。没有来自ID 333的值,因为它们对最后一行有计数。

查询结果应为 1300 (400 + 200 + 200 + 200 + 300)

真实数据库中有大约150个不同的ID

非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

首先,这是一个糟糕的数据库设计。你在数据库中保留了重复的数据(这些总和数量已经存在于数据库中,你只需要计算它们),这只会让你更加头疼。摆脱那一列,完全摆脱这个问题。

那就是说,这应该可以满足您的需求:

;WITH CTE_MaxDates AS
(
    SELECT
        id,
        MAX([date]) AS max_date
    FROM
        My_Table
    WHERE
        [count] > 0
    GROUP BY
        id
)
SELECT
    MT.id,
    SUM(MT.amount)
FROM
    My_Table MT
INNER JOIN CTE_MaxDates MD ON
    MD.id = MT.id AND
    MD.max_date < MT.[date]
GROUP BY
    MT.id

此外,如果这些是实际的列名,那么“date”和“count”会导致错误的列名,因为它们是SQL Server中的保留字,并且它们也不是很具描述性。