sql - 如何将列转换为行并替换列名
问题描述
我有一个表格,可以连续返回月份的产品数量,例如:
[M02] | [M03] | [M04] | [M05] | [M06] | [M07] | [M08] | [M09] |[M10] | [M11] | [M12]
------------------------------------------------------------------------------------
120 | 65 | 75 | 587 | [78 | 5656 | 651 | 65 | 8949 | 89 | 596
现在我需要结果,因为[这里我想将列替换为行并将它们的名称更改为我选择的别名]例如 M01 到 January 从列到行
[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 WHEN
您可以使用CASE WHEN
以下方法来获得所需的输出。
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: INNER JOIN
映射表
您可以有一个映射表,您可以在其中将您的代码与月份进行映射并添加一个INNER JOIN
类似
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
withPATINDEX
来获取数字,最后将数字转换为月份名称。
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,
推荐阅读
- php - 如何在数组中添加if语句
- javascript - .then() 回调中的“return”是从内部范围还是外部范围返回?
- apache-camel - Camel 3.x:禁用路线的自动注册
- javascript - 在 MySQL 中使用不同的键更新多行
- trusted-timestamp - 可以将粗略时间用作时间戳权限吗?
- javascript - 在javascript中动态设置特定标签的样式
- javascript - If else key split JSON
- amazon-web-services - 用于创建 AWS SNS 主题订阅的 Terraform 模块
- r - 在 r 中使用 bas.lm() 进行贝叶斯多元线性回归
- zsh - 如何定义带有子命令的命令的 zsh 自动补全?