SQL Server 2008:将列值转换为行 [英] SQL Server 2008 : Convert column value to row

查看:41
本文介绍了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 Fiddle with Demo

如果你有未知数量的列,那么你可以使用动态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 +')) 你'执行(@查询)

参见SQL Fiddle with Demo

你甚至可以使用UNION ALL:

选择国家代码,'1960'年,1960年值从你的桌子联合所有选择 country_code,'1961' 年,1961 年值从你的桌子联合所有选择 country_code,'1962' 年,1962 年值从你的桌子联合所有选择 country_code, '2011' 年份, 2011 值从你的桌子

参见SQL Fiddle with Demo

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

See SQL Fiddle with Demo

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)

See SQL Fiddle with Demo

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

See SQL Fiddle with Demo

这篇关于SQL Server 2008:将列值转换为行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆