我正在尝试创建包含3列的结果集。每一列来自表A的1列的总和,但按不同的ID分组。
Table A
ID Val.1
1 4
1 5
1 6
2 7
2 8
2 9
3 10
3 11
3 12我想创造一些像这样的东西..
ROW SUM.VAL.1 SUM.VAL.2 SUM.VAL.3
1 15 21 33我知道我不能使用UNION,我正在考虑使用CTE,但逻辑上不太确定。
发布于 2017-02-06 22:27:43
您需要条件聚合
select 1 as Row,
sum(case when ID = 1 then Val.1 end),
sum(case when ID = 2 then Val.1 end),
sum(case when ID = 3 then Val.1 end)
From yourtable 如果ID's的数量不是静态的,您可能需要动态交叉表或透视表
DECLARE @col_list VARCHAR(8000)= Stuff((SELECT ',sum(case when ID = '+ Cast(ID AS VARCHAR(20))+ ' then [Val.1] end) as [val.'+Cast(ID AS VARCHAR(20))+']'
FROM Yourtable
GROUP BY ID
FOR xml path('')), 1, 1, ''),
@sql VARCHAR(8000)
exec('select 1 as Row,'+@col_list +'from Yourtable')发布于 2017-02-06 23:46:21
我认为旋转数据表将产生预期的结果。
IF OBJECT_ID('tempdb..#TableA') IS NOT NULL
DROP TABLE #TableA
CREATE TABLE #TableA
(
RowNumber INT,
ID INT,
Value INT
)
INSERT #TableA VALUES (1, 1, 4)
INSERT #TableA VALUES (1, 1, 5)
INSERT #TableA VALUES (1, 1, 6)
INSERT #TableA VALUES (1, 2, 7)
INSERT #TableA VALUES (1, 2, 8)
INSERT #TableA VALUES (1, 2, 9)
INSERT #TableA VALUES (1, 3, 10)
INSERT #TableA VALUES (1, 3, 11)
INSERT #TableA VALUES (1, 3, 12)
-- https://msdn.microsoft.com/en-us/library/ms177410.aspx
SELECT RowNumber, [1] AS Sum1, [2] AS Sum2, [3] AS Sum3
FROM
(
SELECT RowNumber, ID, Value
FROM #TableA
) a
PIVOT
(
SUM(Value)
FOR ID IN ([1], [2], [3])
) AS p如果您正在寻找的if是恒定的,则此技术有效,否则,如果需要更改if,我想一些动态sql也会起作用。
https://stackoverflow.com/questions/42070090
复制相似问题