【问题标题】:How to select a specific number of rows and convert them into named columns如何选择特定数量的行并将它们转换为命名列
【发布时间】: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


    【解决方案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'  
    

    到子查询。

    【讨论】:

    • 哦,哇...效果很好。非常感谢。
    【解决方案2】:

    你可以在sql中使用pivot。如果您想将行显示为列。

    供您参考,我创建了 2 个表,第一个是 tbltest,第二个是 tbltest2

    tblTest 下面是数据。

    并且在下面的 tblTest2 中是数据。

    您可以使用 pivot 将行转换为列,就像下面的查询一样。

    选择 roomId,1 AS Number1, 2 AS Number2, 3 AS Number3, [4] AS Number4, [5] AS Number5 from ( 选择 t.roomId,WaterMeterNumber,ROW_NUMBER() over(partition by T.roomId order by T.roomId) as Sno from tblTest T 内部加入 tblTest2 T2 on T2.roomId=T.roomId) as P 枢 ( min(waterMeterNumber) for sno in (3,3,3,[4],[5])) 作为 pvt

    结果是这样的:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多