Sql 如何将列转换为行并替换列名

Sql 如何将列转换为行并替换列名,sql,sql-server,database,sql-server-2008,sql-server-2012,Sql,Sql Server,Database,Sql Server 2008,Sql Server 2012,我有一个表,它将产品的w.r.t数量返回到连续的月份,如: [M02] | [M03] | [M04] | [M05] | [M06] | [M07] | [M08] | [M09] |[M10] | [M11] | [M12] ------------------------------------------------------------------------------------ 120 | 65 | 75 | 587 | [78 | 5656 | 65

我有一个表,它将产品的w.r.t数量返回到连续的月份,如:

[M02] | [M03] | [M04] | [M05] | [M06] | [M07] | [M08] | [M09] |[M10] | [M11] | [M12]
------------------------------------------------------------------------------------
120   | 65    | 75    | 587   | [78   | 5656  | 651   | 65    | 8949 | 89   | 596
现在我需要的结果是[这里我想将列替换为行,并将它们的名称更改为我选择的别名]例如,从一列到另一行的M01到一月

  [Month]  | [Count] |
----------------------
  January  |     120 |
  February |     65  |
我知道我可以通过UnPivot操作符实现这一点,但我无法获得月份的名称,因为我无法在UnPivot中设置别名

我写了这个查询

SELECT [Months],[Count]
  FROM [TableName]
  UnPivot(
  [Count] for Months in ([M01]
      ,[M02]
      ,[M03]
      ,[M04]
      ,[M05]
      ,[M06]
      ,[M07]
      ,[M08]
      ,[M09]
      ,[M10]
      ,[M11]
      ,[M12])
  ) as unpiv
这给了我以下数据:

      [Month]  | [Count] |
    ----------------------
      M01      |     120 |
      M02      |     65  |

这里的M01、M02等分别是个月,但我不能更改它们的名称。如何实现这一点?

方法1:在

当像下面这样时,您可以使用
CASE来获得所需的输出

SELECT    
    (CASE 
    WHEN [Months]= 'M01' then 'January'
    WHEN [Months]= 'M02' then 'February'
        --PUT Remaning conditions
    END) [Months],
    [Count]

FROM
(
SELECT [Months],[Count]
    FROM [TableName]
    UnPivot(
    [Count] for Months in ([M01]
        ,[M02]
        ,[M03]
        ,[M04]
        ,[M05]
        ,[M06]
        ,[M07]
        ,[M08]
        ,[M09]
        ,[M10]
        ,[M11]
        ,[M12])
    ) as unpiv
)T
方法2:
内部连接到映射表

您可以有一个映射表,在该表中,您可以将代码映射为月份,并放置一个
内部联接

SELECT 
MP.MonthName,
T.[Count]
FROM
(
SELECT [Months],[Count]
  FROM [TableName]
  UnPivot(
  [Count] for Months in ([M01]
      ,[M02]
      ,[M03]
      ,[M04]
      ,[M05]
      ,[M06]
      ,[M07]
      ,[M08]
      ,[M09]
      ,[M10]
      ,[M11]
      ,[M12])
  ) as unpiv
)t
INNER JOIN [YourMappingTable] MP ON MP.Code=T.Months
方法3:字符串函数

另一种方法是使用
RIGHT
PATINDEX
获取数字,最后将数字转换为月份名称

SELECT 
DateName( month , DateAdd( month ,  CAST(RIGHT(T.[Months],PATINDEX('%[0-9]%',T.[Months])) AS INT) , 0 ) - 1 ) as Months,
[Count]
FROM
(
SELECT [Months],[Count]
  FROM [TableName]
  UnPivot(
  [Count] for Months in ([M01]
      ,[M02]
      ,[M03]
      ,[M04]
      ,[M05]
      ,[M06]
      ,[M07]
      ,[M08]
      ,[M09]
      ,[M10]
      ,[M11]
      ,[M12])
  ) as unpiv
)t
注意:如果格式是固定的,您也可以在不使用
PATINDEX

DateName( month , DateAdd( month ,  CAST(RIGHT(T.[Months],2) AS INT) , 0 ) - 1 ) as Months,

无法在UNPIVOT函数内指定别名,因此必须使用CASE表达式

谢谢你的详细解释。谢谢你的帮助