Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 行到列的部分转换_Sql_Sql Server_Sql Server 2008_Pivot - Fatal编程技术网

Sql 行到列的部分转换

Sql 行到列的部分转换,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,谁能指导我如何调整我的数据。我有: RowID Dimension Value 1 Country Italy 1 Year 2011 1 GDP 4 1 Population 6 2 Country Spain 2 Year 2011 2 GDP 7 2 Population 5 我想以这样的方式: RowID Country Year GDP Population 1 Italy 2011 4 6 2 Spain 2011 7 5 另外,我使用MS SQL Server 2008 R2

谁能指导我如何调整我的数据。我有:

RowID Dimension Value
1 Country Italy
1 Year 2011
1 GDP 4
1 Population 6
2 Country Spain
2 Year 2011
2 GDP 7
2 Population 5
我想以这样的方式:

RowID Country Year GDP Population
1 Italy 2011 4 6
2 Spain 2011 7 5

另外,我使用MS SQL Server 2008 R2 Express Edition。我尝试使用PIVOT,但它返回了许多带有NULL的行,因此我无法理解

您可以为此使用
PIVOT
。如果您知道所有值,则可以对其进行硬编码:

select *
from
(
  select rowid, dimension, value
  from yourtable
) src
pivot
(
  max(value)
  for dimension in ([Country], [Year], [GDP], [Population])
) piv

或者,如果您没有访问
PIVOT
功能的权限,则可以使用带有
案例的聚合:

select rowid,
  max(case when dimension = 'country' then value end) country,
  max(case when dimension = 'Year' then value end) Year,
  max(case when dimension = 'GDP' then value end) GDP,
  max(case when dimension = 'Population' then value end) Population
from yourtable
group by rowid

如果值的数目未知,则可以使用动态sql:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Dimension) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT rowid, ' + @cols + ' from 
             (
                select rowid, dimension, value
                from yourtable
            ) x
            pivot 
            (
                max(value)
                for dimension in (' + @cols + ')
            ) p '

execute(@query)
请参见

可能的副本