没有聚合和多个数据透视列的数据透视 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
总是 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)
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
我遇到过这种情况,我认为最好的解决方案是使用数据透视表函数,但我真的不知道该怎么做。或者也许有更好的方法来做到这一点...
我得到这个 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
总是 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)
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