没有聚合和多个数据透视列的数据透视 table

Pivot table without aggregation and multiple pivot columns

我遇到过这种情况,我认为最好的解决方案是使用数据透视表函数,但我真的不知道该怎么做。或者也许有更好的方法来做到这一点...

我得到这个 table 作为来源 :

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 tables 的一个枢轴。 这在 TSQL 中可行吗,我正在使用 SQL Server 2012。

你想根据 id、版本和代码进行分组,所以它很简单 pivot:

Select * from TableName
pivot(max(value) for property in([prop1],[prop2],[prop3]))p

如果 table 有更多列,那么您需要先选择正确的列:

;with cte as(Select id, version, code, property, value from TableName)
Select * from cte
pivot(max(value) for property in([prop1],[prop2],[prop3]))p

如果 property 总是 prop1prop2prop3,您可以使用条件聚合来做到这一点:

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 以供参考。

SQL Fiddle

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)
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