sql - 按某些列 SQL 旋转(转置)
问题描述
我希望通过表中的某些列进行转置。我有类似以下示例的内容:
╔════════╦═══════╦══════╦══════╦═════════╦══════╦═══════╦═══════╦═══════╦═══════╦═══════╦═══════╦═══════╗
║ name ║ week ║ colX ║ ColY ║ Col.... ║ ColZ ║ Day 1 ║ Day 2 ║ Day 3 ║ Day 4 ║ Day 5 ║ Day 6 ║ Day 7 ║
╠════════╬═══════╬══════╬══════╬═════════╬══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╣
║ name x ║ week1 ║ xxx ║ yyy ║ .... ║ zzz ║ 0 ║ 5 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║
╠════════╬═══════╬══════╬══════╬═════════╬══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╣
║ name Y ║ week1 ║ xxx ║ yyy ║ .... ║ zzz ║ 4 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║
╠════════╬═══════╬══════╬══════╬═════════╬══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╣
║ name Z ║ week1 ║ xxx ║ yyy ║ .... ║ zzz ║ 0 ║ 0 ║ 5 ║ 0 ║ 5 ║ 0 ║ 0 ║
╠════════╬═══════╬══════╬══════╬═════════╬══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╣
║ name x ║ week2 ║ xxx ║ yyy ║ .... ║ zzz ║ 0 ║ 0 ║ 0 ║ 5 ║ 5 ║ 0 ║ 0 ║
╠════════╬═══════╬══════╬══════╬═════════╬══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╣
║ name Y ║ week2 ║ xxx ║ yyy ║ .... ║ zzz ║ 5 ║ 0 ║ 0 ║ 0 ║ 4 ║ 0 ║ 0 ║
╠════════╬═══════╬══════╬══════╬═════════╬══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╬═══════╣
║ name Z ║ week2 ║ xxx ║ yyy ║ .... ║ zzz ║ 0 ║ 4 ║ 5 ║ 4 ║ 0 ║ 0 ║ 2 ║
╚════════╩═══════╩══════╩══════╩═════════╩══════╩═══════╩═══════╩═══════╩═══════╩═══════╩═══════╩═══════╝
我想将信息转置为每行显示 1 天,其余信息按原样显示,我知道这将创建更多行,但有助于保持更清晰的信息。
右边的每一行显示 1 周,然后是该周的 7 天,以及每个项目每天分配的小时数(比如说 colX 值)。我试图仅按天进行转置,但我不知道如何仅将枢轴用于几个值。
解决方案
这是您的数据的示例:
with t as (
select ' name x ' name,' week1 ' week,' xxx ' colx,' yyy ' coly,' .... ' colxyz,' zzz ' colz,' 0 'day1, ' 5 'day2, ' 0 'day3, ' 0 'day4, ' 0 ' day5,' 0 ' day6, ' 0 ' day7 union all
select ' name Y ',' week1 ',' xxx ',' yyy ',' .... ',' zzz ',' 4 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ',' 0 ' union all
select ' name Z ',' week1 ',' xxx ',' yyy ',' .... ',' zzz ',' 0 ',' 0 ',' 5 ',' 0 ',' 5 ',' 0 ',' 0 ' union all
select ' name x ',' week2 ',' xxx ',' yyy ',' .... ',' zzz ',' 0 ',' 0 ',' 0 ',' 5 ',' 5 ',' 0 ',' 0 ' union all
select ' name Y ',' week2 ',' xxx ',' yyy ',' .... ',' zzz ',' 5 ',' 0 ',' 0 ',' 0 ',' 4 ',' 0 ',' 0 ' union all
select ' name Z ',' week2 ',' xxx ',' yyy ',' .... ',' zzz ',' 0 ',' 4 ',' 5 ',' 4 ',' 0 ',' 0 ',' 2 '
)
select * from t unpivot (dayVal for dayName in (day1, day2, day3, day4, day5, day6, day7)) t
有关使用 unpivot 的更多详细信息,请参阅microsoft 文档。
推荐阅读
- rust - 将属性应用于宏扩展
- javascript - 试图让 Cypress、TypeScript 和 IstanbulJS 一起工作
- c++ - `向量之间的区别
v;`和`向量 v = 向量 ();` - autocad - 如何为 POLYLINE 编写 DXF 代码?
- apache-spark - 在不使用 collect 的情况下迭代 spark 数据帧的每一行
- ubuntu - 未检测到正确的 cmake 版本,无法安装 ANT
- javascript - 如何在 javascript 中使用 youtube data api 获取查看次数?
- php - 如何创建一个可以从 mysql 调用特定数据库的文件取决于用户选择的内容?
- excel - 多次调用时 Sub 变慢
- r - 替代嵌套的 for do 循环