SQL Server 2008:将列值转换为行 [英] SQL Server 2008 : Convert column value to row
本文介绍了SQL Server 2008:将列值转换为行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个以下格式的表格
<前>Country_Code |1960 |1961 |1962 |..... |2011年------------------------------------------------IND |va11 |va12 |va13 |..... |va1x澳大利亚 |va21 |va22 |va23 |..... |va2x英文 |va31 |va32 |va33 |..... |va3x我想把它转换成下面的格式
<前>Country_Code |年 |价值---------------------------IND |1960 |va11IND |1961 |va12IND |1962 |va13..IND |2011 |va1x澳大利亚 |1960 |va21澳大利亚 |1961 |va22澳大利亚 |1962 |va23..澳大利亚 |2011 |va2x英文 |1960 |va31英文 |1961 |va32英文 |1962 |va33..英文 |2011 |va3x如何通过sql查询或sql server程序集实现?
解决方案
你可以通过 UNPIVOT
.如果您有已知数量的列,那么您可以对这些值进行硬编码:
选择国家代码、年份、值从你的桌子转轴(价值年份 ([1960], [1961], [1962], [2011])) 你
如果你有未知数量的列,那么你可以使用动态sql:
DECLARE @colsUnpivot AS NVARCHAR(MAX),@query AS NVARCHAR(MAX)select @colsUnpivot = stuff((select ','+quotename(C.name)从 sys.columns 作为 C其中 C.object_id = object_id('yourtable') 和C.name != 'Country_Code'对于 xml 路径('')), 1, 1, '')设置@query= '选择国家代码,年份,值从你的桌子转轴(价值年份 ('+ @colsunpivot +')) 你'执行(@查询)
你甚至可以使用UNION ALL
:
选择国家代码,'1960'年,1960年值从你的桌子联合所有选择 country_code,'1961' 年,1961 年值从你的桌子联合所有选择 country_code,'1962' 年,1962 年值从你的桌子联合所有选择 country_code, '2011' 年份, 2011 值从你的桌子
I have a table in the following format
Country_Code | 1960 | 1961 | 1962 | ..... | 2011 ------------------------------------------------ IND | va11 | va12 | va13 | ..... | va1x AUS | va21 | va22 | va23 | ..... | va2x ENG | va31 | va32 | va33 | ..... | va3x
I want to convert it into the below format
Country_Code | Year | Value --------------------------- IND | 1960 | va11 IND | 1961 | va12 IND | 1962 | va13 . . IND | 2011 | va1x AUS | 1960 | va21 AUS | 1961 | va22 AUS | 1962 | va23 . . AUS | 2011 | va2x ENG | 1960 | va31 ENG | 1961 | va32 ENG | 1962 | va33 . . ENG | 2011 | va3x
How can this be achieved by sql query or sql server assembly ?
解决方案
You can be done with UNPIVOT
. If you have a known number of columns then you can hard-code the values:
select Country_Code, year, value
from yourtable
unpivot
(
value
for year in ([1960], [1961], [1962], [2011])
) u
If you have an unknown number of columns, then you can use dynamic sql:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('yourtable') and
C.name != 'Country_Code'
for xml path('')), 1, 1, '')
set @query
= 'select country_code, year, value
from yourtable
unpivot
(
value
for year in ('+ @colsunpivot +')
) u'
exec(@query)
Of you can even use a UNION ALL
:
select country_code, '1960' year, 1960 value
from yourtable
union all
select country_code, '1961' year, 1961 value
from yourtable
union all
select country_code, '1962' year, 1962 value
from yourtable
union all
select country_code, '2011' year, 2011 value
from yourtable
这篇关于SQL Server 2008:将列值转换为行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文