如何 select 特定数量的行并将它们转换为命名列
How to select a specific number of rows and convert them into named columns
这个问题我已经挂了好几个小时了。
一个非常简单的查询:
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 中组合五个 windowing 函数,但问题是我无法在 window 查询中动态设置房间 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
有没有办法用枢轴函数或类似的东西来实现这个目标?
提前谢谢你。
您可以使用条件聚合:
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 中使用数据透视表。如果你想显示行到列。
为了您的参考,我创建了 2 个表,第一个是 tbltest,第二个是 tbltest2
下面是tblTest中的数据。
下面的tblTest2中是数据。
您可以使用 pivot 将行转换为列,就像下面的查询一样。
Select roomId,1 AS Number1, 2 AS Number2, 3 AS Number3, [4] AS Number4, [5] AS Number5 来自
(
Select t.roomId,WaterMeterNumber,ROW_NUMBER() over(partition by T.roomId order by T.roomId) as Sno from tblTest T
inner 在 T2.roomId=T.roomId) 上加入 tblTest2 T2 作为 P
枢
( min(waterMeterNumber) for sno in (3,3,3,[4],[5])) as pvt
结果是这样的:
这个问题我已经挂了好几个小时了。
一个非常简单的查询:
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 中组合五个 windowing 函数,但问题是我无法在 window 查询中动态设置房间 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
有没有办法用枢轴函数或类似的东西来实现这个目标?
提前谢谢你。
您可以使用条件聚合:
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 中使用数据透视表。如果你想显示行到列。
为了您的参考,我创建了 2 个表,第一个是 tbltest,第二个是 tbltest2
下面是tblTest中的数据。
下面的tblTest2中是数据。
您可以使用 pivot 将行转换为列,就像下面的查询一样。
Select roomId,1 AS Number1, 2 AS Number2, 3 AS Number3, [4] AS Number4, [5] AS Number5 来自 ( Select t.roomId,WaterMeterNumber,ROW_NUMBER() over(partition by T.roomId order by T.roomId) as Sno from tblTest T inner 在 T2.roomId=T.roomId) 上加入 tblTest2 T2 作为 P 枢 ( min(waterMeterNumber) for sno in (3,3,3,[4],[5])) as pvt
结果是这样的: