我在查询时遇到了一些麻烦。对于每个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
非常感谢您的帮助:)
答案 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中的保留字,并且它们也不是很具描述性。