【发布时间】:2021-07-20 16:38:55
【问题描述】:
我在这个问题上纠结了好几个小时。
一个非常简单的查询:
SELECT
RoomId,
WaterMeterNumber
FROM Watermeter
WHERE RoomId = GR.RoomId
SQL 结果:
| RoomId | WaterMeterNumber |
|---|---|
| 95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF | SZ12800491 |
| 95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF | 3375791 |
| 95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF | 45332 |
| 95E5ACE0-FEE4-4D33-BC22-0DCF7B1155CF | SK9649 |
我希望查询结果是这样的:
| RoomId | Number1 | Number2 | Number3 | Number4 | Number5 |
|---|---|---|---|---|---|
| 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
有没有办法通过枢轴函数或类似的东西来实现这一点?
提前谢谢你。
【问题讨论】:
标签: sql pivot sql-server-2019