非传统的不受欢迎和加入

时间:2014-02-27 18:28:33

标签: sql sql-server tsql ssms reportbuilder3.0

我环顾四周,但我没有发现任何完全相同的内容,所以我认为每个人都可能会有所帮助。长话短说,我有一个列有一年,后面是包含数字的月份列:

[year] | [month1] | [month2]
1999       4          2

基本上,我想把这个月打开,所以我可以将它命名为“March”或“03”之类的正常名称,同时将年份保持在左侧,将数字保持在右侧:

[year] | [month] | [numbers]
1999      month1      4
1999      month2      2

最后,我想把它带到Report Builder中,但我会留待以后再说。这是我正在使用的数据的副本。

我真的希望这是描述性的,因为这已经困扰了我几天。

CSYEAR  CSOR01  CSOR02  CSOR03  CSOR04  CSOR05  CSOR06  CSOR07  CSOR08  CSOR09  CSOR10  CSOR11  CSOR12
1999        2       0       0       0       1       2       0       3       1       4       0       3
2000        4       1       3       3       2       2       2       2       4       1       4       4

1999    CSOR01  2                                       
1999    CSOR02  0                                       
1999    CSOR03  0                                       
1999    CSOR04  0                                       
1999    CSOR05  1                                       
1999    CSOR06  2                                       
1999    CSOR07  0                                       
1999    CSOR08  3                                       
1999    CSOR09  1                                       
1999    CSOR10  4                                       
1999    CSOR11  0                                       
1999    CSOR12  3                                       
2000    CSOR01  4                                       
2000    CSOR02  1                                       
2000    CSOR03  3                                       
2000    CSOR04  3                                       
2000    CSOR05  2                                       
2000    CSOR06  2                                       
2000    CSOR07  2                                       
2000    CSOR08  2                                       
2000    CSOR09  4                                       
2000    CSOR10  1                                       
2000    CSOR11  4                                       
2000    CSOR12  4                                       

谢谢大家的建议。

2 个答案:

答案 0 :(得分:3)

SELECT CSYEAR, MONTH, NUMBER
FROM myTable
UNPIVOT
(
  NUMBER
  for MONTH in (CSOR01, CSOR02, CSOR03, CSOR04, CSOR05, CSOR06, CSOR07, CSOR08, CSOR09, CSOR10, CSOR11, CSOR12)
) u;

SQLFiddle here

答案 1 :(得分:0)

我没有足够高的声誉评分来评论@PinnyM的优秀答案,但如果您正在寻找月份的名称,您可以修改它以执行以下操作:

SELECT
  CSYEAR, 
  MONTH,
  DATENAME(Month, CAST(RIGHT(MONTH,2) AS VARCHAR(2)) + '/01/1900'), 
  NUMBER
FROM myTable
UNPIVOT
(
  NUMBER
  for MONTH in (CSOR01, CSOR02, CSOR03, CSOR04, CSOR05, CSOR06, CSOR07, CSOR08, CSOR09, CSOR10, CSOR11, CSOR12)
) u;

SQL Fiddle