sql—如何选择特定数量的行并将它们转换为命名列

wlsrxk51  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(404)

我对这个问题纠结了好几个小时。
一个非常简单的查询:

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来实现这一点?
先谢谢你。

cidc1ykv

cidc1ykv1#

可以使用条件聚合:

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'

到子查询。

55ooxyrt

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
结果是这样的:

相关问题