我对这个问题纠结了好几个小时。
一个非常简单的查询:
SELECT
RoomId,
WaterMeterNumber
FROM Watermeter
WHERE RoomId = GR.RoomId
sql结果:
房间水表编号95E5ACE0-fee4-4d33-bc22-0dcf7b1155cfsz1280049195e5ace0-fee4-4d33-bc22-0dcf7b1155cf337579195e5ace0-fee4-4d33-bc22-0dcf7b1155cf4533295e5ace0-fee4-4d33-bc22-0dcf7b1155cfsk9649
我希望查询结果如下:
房间号码号码号码号码号码号码号码号码495E5ACE0-fee4-4d33-bc22-0DCF7B1155CFSZ1280049137579145332SK9649
我总是想显示一个房间前五个水表的数字。所以列需要有一个静态名称。
我已经尝试在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
这个查询可以工作,但是我所说的室友应该是动态的。
我希望这样,这样我就可以在另一个主查询中使用它。
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
有没有办法用pivot函数或类似的smth来实现这一点?
先谢谢你。
2条答案
按热度按时间cidc1ykv1#
可以使用条件聚合:
如果你只想要一个
RoomId
,然后添加:到子查询。
55ooxyrt2#
您可以在sql中使用pivot。如果要将行显示为列。
为了您的参考,我创建了两个表,第一个是tbltest,第二个是tbltest2
在tbltest下面是数据。
在下面的tbltest2中是数据。
您可以使用pivot将行转换为列,就像下面的查询一样。
选择roomid,1作为number1,2作为number2,3作为number3,[4]作为number4,[5]作为number5 from(select t.roomid,watermeternumber,row\u number()over(partition by t.roomid order by t.roomid)作为sno from tbltest t inner join tbltest2 t2 on t2.roomid=t.roomid)作为p pivot(min(watermeternumber)for sno in(3,3,3,[4],[5]),作为pvt
结果是这样的: