如何解决如何选择特定数量的行并将它们转换为命名列
我在这个问题上纠结了好几个小时。
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 |
我希望查询结果是这样的:
房间编号 | 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,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'
到子查询。
,你可以在sql中使用pivot。如果您想按列显示行。
作为参考,我创建了 2 个表,第一个是 tbltest,第二个是 tbltest2
在下面的 tblTest 中是数据。
在下面的 tblTest2 中是数据。
您可以使用数据透视表将行转换为列,就像下面的查询一样。
选择 roomId,1 AS Number1,2 AS Number2,3 AS Number3,[4] AS Number4,[5] AS Number5 从 ( 从 tblTest T 中选择 t.roomId,WaterMeterNumber,ROW_NUMBER() over(partition by T.roomId order by T.roomId) 作为 Sno 在 T2.roomId=T.roomId) 上加入 tblTest2 T2 作为 P 枢 ( min(waterMeterNumber) for sno in (3,3,[4],[5])) 作为 pvt
结果是这样的:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。