对于此表:
+----+--------+-------+
| ID | Status | Value |
+----+--------+-------+
| 1 | 1 | 4 |
| 2 | 1 | 7 |
| 3 | 1 | 9 |
| 4 | 2 | 1 |
| 5 | 2 | 7 |
| 6 | 1 | 8 |
| 7 | 1 | 9 |
| 8 | 2 | 1 |
| 9 | 0 | 4 |
| 10 | 0 | 3 |
| 11 | 0 | 8 |
| 12 | 1 | 9 |
| 13 | 3 | 1 |
+----+--------+-------+
我需要将具有相同顺序的组相加,Status
以产生此结果。
+--------+------------+
| Status | Sum(Value) |
+--------+------------+
| 1 | 20 |
| 2 | 8 |
| 1 | 17 |
| 2 | 1 |
| 0 | 15 |
| 1 | 9 |
| 3 | 1 |
+--------+------------+
如何在SQL Server中做到这一点?
注意:该ID
列中的值是连续的。
根据我在您的问题中添加的标签,这是一个空白和孤岛的问题。
效果最好的解决方案可能是
WITH T
AS (SELECT *,
ID - ROW_NUMBER() OVER (PARTITION BY [STATUS] ORDER BY [ID]) AS Grp
FROM YourTable)
SELECT [STATUS],
SUM([VALUE]) AS [SUM(VALUE)]
FROM T
GROUP BY [STATUS],
Grp
ORDER BY MIN(ID)
如果ID
值不能保证如所述连续,那么您将需要使用
ROW_NUMBER() OVER (ORDER BY [ID]) -
ROW_NUMBER() OVER (PARTITION BY [STATUS] ORDER BY [ID]) AS Grp
而是在CTE定义中。
SQL小提琴
问题内容: 我有一些这样的数据: 我想查询它看起来像这样: …这样我就可以按数字连续的方式按GROUP BY分组。 另外,循环/游标也是不可能的,因为我正在处理大量数据,谢谢。 问题答案:
问题内容: 我有下表称为问题: 我只想选择每个询问者一次,如果有多个同名提问者,请选择ID最高的一个。因此,预期结果: 我使用以下查询: 我得到以下结果: 因此,它将选择遇到的第一个“鲍勃”,而不是最后一个。 谢谢 问题答案: 如果要为每一个添加最后一个,则应使用聚合函数: 之所以得到不寻常的结果,是因为MySQL使用了一个扩展名,该扩展名允许未选择列表中的项进行汇总,并且不包含在GROUP BY
我有以下称为问题的表: 我想选择每个asker只一次,如果有多个asker具有相同的名称,选择最高的ID之一。所以,预期的结果: 我使用以下查询: 我得到以下结果: 它选择遇到的第一个‘鲍勃',而不是最后一个。
对于一项作业,我必须要求学生人数。提示用户输入学生的lastname和分数,然后按降序对分数排序并显示。我已经做了所有这些,但不知道如何排序的名字,如果他们有相同的分数。 约翰33岁 亚当33 菲尔22 我无法得到所需的输出。我通常能解决这类问题,但这个问题让我分崩离析…请救命!
我有4张桌子。对于这个问题,我将它们命名为tableA、tableB、tableC、tableD。 TableB看起来像这样:id、name、tag、some_other_parameters tableC看起来是这样的:id、代码、一些其他参数 表格列:id、tableA_id、tableB_id、tableC_id、entityVersion tableD中的列没有在实体中定义一对多、多对一关
问题内容: 如果我有这样的数据: 我如何将命令连接成这样: 我在下面使用了此查询,但命令列的顺序不依其顺序号而定: 任何意见和建议将不胜感激。^ _ ^ 问题答案: 永远不要使用。阅读为什么不在Oracle中使用WM_CONCAT函数? 请参阅本主题https://stackoverflow.com/a/28758117/3989608。 它没有记录,并且依赖的任何应用程序一旦升级到后都将无法工作