Sql 如何将列转换为行并替换列名
我有一个表,它将产品的w.r.t数量返回到连续的月份,如: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
[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表达式 谢谢你的详细解释。谢谢你的帮助