首页 > 解决方案 > 如何选择特定数量的行并将它们转换为命名列

问题描述

我在这个问题上挂了几个小时。

一个非常简单的查询:

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

有没有办法通过枢轴功能或类似的东西来实现这一点?

先感谢您。

标签: sqlpivotsql-server-2019

解决方案


您可以使用条件聚合:

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'  

到子查询。


推荐阅读