我遇到过这种情况,我认为最好的解决方案是使用枢轴功能,但我真的不知道该怎么做。或者也许有更好的方法来做到这一点......
我把这张桌子作为来源:
ID | version | code | property | value
-----|---------|------|----------|------
110| 1| AA| prop1| 10
110| 1| AA| prop2| 20
110| 1| AA| prop3| 30
110| 1| BB| prop1| 10
110| 1| BB| prop2| 40
110| 1| BB| prop3| 20
110| 2| AA| prop1| 50
120| 1| BB| prop2| 60
120| 2| AA| prop3| 80
我想要的最终结果如下:
ID | version | code | prop1 | prop2 | prop3
-----|---------|------|-------|-------|------
110| 1| AA| 10| 20| 30
110| 1| BB| 10| 40| 20
110| 2| AA| 50| |
120| 1| BB| | 60|
120| 2| AA| | | 80
所以你看,我不做聚合,只是前3个表的一个支点。 这在TSQL中是否可行,我使用的是SQL Server 2012。
答案 0 :(得分:2)
您希望对ID,版本和代码进行分组,因此它是简单的支点:
Select * from TableName
pivot(max(value) for property in([prop1],[prop2],[prop3]))p
如果表格中有更多列,那么您需要先选择正确的列:
;with cte as(Select id, version, code, property, value from TableName)
Select * from cte
pivot(max(value) for property in([prop1],[prop2],[prop3]))p
答案 1 :(得分:1)
如果property
始终是prop1
,prop2
和prop3
,您可以使用条件聚合执行此操作:
SELECT
ID
, Version
, Code
, MAX(CASE WHEN Property = 'prop1' THEN VALUE END) AS [prop1]
, MAX(CASE WHEN Property = 'prop2' THEN VALUE END) AS [prop2]
, MAX(CASE WHEN Property = 'prop3' THEN VALUE END) AS [prop3]
FROM SampleData
GROUP BY ID, Version, Code
这是一种动态方法。请阅读此article以供参考。
DECLARE @sql1 VARCHAR(4000) = ''
DECLARE @sql2 VARCHAR(4000) = ''
DECLARE @sql3 VARCHAR(4000) = ''
SELECT @sql1 =
'SELECT
ID
, Version
, Code
'
SELECT @sql2 = @sql2 +
' , MAX(CASE WHEN Property = ''' + Property + ''' THEN VALUE END) AS [' + Property + ']' + CHAR(10)
FROM(
SELECT DISTINCT Property FROM SampleData
)t
ORDER BY Property
SELECT @sql3 =
'FROM SampleData
GROUP BY ID, Version, Code
ORDER BY ID, Version, Code'
PRINT(@sql1 + @sql2 + @sql3)
EXEC (@sql1 + @sql2 + @sql3)
答案 2 :(得分:1)
declare @t table (Id int,version int,code varchar(10),property varchar(10),val int)
insert into @t (Id,version,code,property,val)values (110,1,'AA','prop1',10),
(110,1,'AA','prop2',20),(110,1,'AA','prop3',30),(110,1,'BB','prop1',10),
(110,1,'BB','prop2',40),(110,1,'BB','prop3',20),(110,2,'AA','prop1',50),(120,1,'BB','prop2',60),
(120,1,'AA','prop3',80)
select Id,version,code,[prop1],[prop2],[prop3]
from (
select ID,version,code,property,val
from @t )t
PIVOT(SUM(val)FOR Property IN ([prop1],[prop2],[prop3]))p