【发布时间】:2018-06-14 17:24:53
【问题描述】:
我有一张表,其中每个 ID 都有一个或多个位置,每个位置都有一个计数。地点可以在 ID 中重复。它存储在这样的行中:
ID ColumnName DataValue
1 place1 ABC
1 count1 5
2 place1 BEC
2 count1 12
2 place2 CDE
2 count2 6
2 place3 BEC
2 count3 9
3 place1 BBC
3 count1 5
3 place2 BBC
3 count2 4
最终,我想要一个表,其中每个可能的地名都是它自己的列,并且每个 ID 的每个地方的计数被汇总,如下所示:
ID ABC BEC CDE BBC
1 5 0 0 0
2 0 21 6 0
3 0 0 0 9
我不知道解决这个问题的最佳方法。大约有 50 种不同的可能地名,因此在查询中专门列出它们并不理想。我知道我最终必须对数据进行透视,但我不知道我应该在汇总计数之前还是之后进行。而且无论是之前还是之后,我都无法弄清楚如何去总结。
任何想法/帮助将不胜感激。在这一点上,我很难找到从哪里开始。我看过一些有类似问题的帖子,但没有比这更令人费解的了。
编辑: 现在我正在使用它来旋转表格,但这给我留下了名为 place1、place2、...的列。count1、count2、... 而且我不知道如何适当地总结计数并使用地名创建新列。
DECLARE @cols NVARCHAR(MAX), @query NVARCHAR(MAX);
SET @cols = STUFF(
(
SELECT DISTINCT
','+QUOTENAME(c.[ColumnName])
FROM #temp c FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)'), 1, 1, '');
SET @query = 'SELECT [ID], '+@cols+'from (SELECT [ID],
[DataValue] AS [amount],
[ColumnName] AS [category]
FROM #temp
)x pivot (max(amount) for category in ('+@cols+')) p';
EXECUTE (@query);
【问题讨论】:
-
抱歉,这是 Microsoft SSMS
-
一个ID可以拥有的位置数量是否有最大限制?如果是这样,你只需要一个支点。如果没有,您将需要使用动态 SQL 来计算最大位置数,然后动态编写 SQL 以对其进行透视。
-
编写一个查询,将源数据表转换为具有列的数据集:id、place 和 count。然后以结果为中心
-
没有限制。你能更详细地了解如何做支点吗?我拥有的枢轴代码将为我提供标记为 place1、place2、place3、...、count1、count2、count3、...的列,我不知道如何汇总具有相同地名的计数。换句话说,我不知道如何将 place1 与 count1 等相关联,并将计数与每个 ID 的相似地点相加
-
您应该将数据透视查询添加到问题中。
标签: sql sql-server sum pivot crosstab