sql - 如何选择特定数量的行并将它们转换为命名列
问题描述
我在这个问题上挂了几个小时。
一个非常简单的查询:
SELECT
RoomId,
WaterMeterNumber
FROM Watermeter
WHERE RoomId = GR.RoomId
SQL 结果:
房间号 | 水表号 |
---|---|
95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF | SZ12800491 |
95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF | 3375791 |
95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF | 45332 |
95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF | SK9649 |
我希望查询结果是这样的:
房间号 | 1号 | 2号 | 编号3 | 编号4 | 编号5 |
---|---|---|---|---|---|
95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF | SZ12800491 | 3375791 | 45332 | SK9649 |
我总是想显示一个房间的前五个水表的数字。所以列需要有一个静态名称。
我已经尝试在 mssql 中组合五个窗口函数,但问题是我无法在窗口查询中动态设置房间 ID。
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY WaterMeterId ASC) AS rownumber,
RoomId,
WaterMeterNumber
FROM WaterMeter
WHERE RoomId='95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF'
) AS X
WHERE rownumber = 1
这个查询可以工作,但我怎么说 RoomId 需要是动态的。
我想要这样,所以我可以在另一个主查询中使用它。
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY WaterMeterId ASC) AS rownumber,
RoomId,
WaterMeterNumber
FROM X.WaterMeter
WHERE X.RoomId= GR.RoomId
) AS X
WHERE rownumber = 1
有没有办法通过枢轴功能或类似的东西来实现这一点?
先感谢您。
解决方案
您可以使用条件聚合:
SELECT RoomId,
MAX(CASE WHEN seqnum = 1 THEN WaterMeterNumber END) as watermeter_1,
MAX(CASE WHEN seqnum = 2 THEN WaterMeterNumber END) as watermeter_2,
MAX(CASE WHEN seqnum = 3 THEN WaterMeterNumber END) as watermeter_3,
MAX(CASE WHEN seqnum = 4 THEN WaterMeterNumber END) as watermeter_4,
MAX(CASE WHEN seqnum = 5 THEN WaterMeterNumber END) as watermeter_5
FROM (SELECT wm.*
ROW_NUMBER() OVER (PARTITION BY RoomId ORDER BY WaterMeterId ASC) AS seqnum,
FROM WaterMeter wem
) wm
GROUP BY RoomId;
如果您只想要一个RoomId
,请添加:
WHERE RoomId='95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF'
到子查询。
推荐阅读
- c++ - 在 C++ 数组中添加新项目
- reactjs - 元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“调色板”
- bash - 使用 grep 删除字符串中的重复项
- reactjs - 带有处理程序的自定义 useState 未按预期工作
- r - 使用 R 中的 data.table 进行分组条件过滤
- postgresql - 在 PostgreSQL 中使用数组或 json 格式化字符串列
- reactjs - jss-snapshot-serializer:jss 嵌套选择器或@media 查询不会添加到 json 快照 (JEST)
- python - 在 Pandas Dataframe 中获取具有非零列的前 11 行
- javascript - 将 (number | number[]) 转换为 number[]
- git - 如何使用 git 忽略自动生成的文件?