SQL Server查询-如何透视这组数据

时间:2018-08-16 22:02:28

标签: sql-server tsql pivot

我一直在玩,只是没有提出任何可行的方法:(我有一个简单的查询:

SELECT DISTINCT IP.DeviceUID, IP.DeviceName, d.NodeName from Devices d
    inner join IPSCHEMA IP on IP.PLCIP=d.CommunicationAddress

这将我带到我要透视的数据(下面是该数据的子集):

|---------------------|------------------|------------------|
|      DeviceUID      |     DeviceName   |     NodeName     |
|---------------------|------------------|------------------|
|         226         |      Boiler      |      BOILER      |
|---------------------|------------------|------------------|
|         226         |      Boiler      |      AMMONIA     |
|---------------------|------------------|------------------|
|         226         |      Boiler      |      CHILLER     |
|---------------------|------------------|------------------|
|         230         |      SSilo       |      SSUG        |
|---------------------|------------------|------------------|
|         230         |      SSilo       |      WALKER      |
|---------------------|------------------|------------------|
|         29          |      Cooling     |      AMMONIA     |
|---------------------|------------------|------------------|
|         29          |      Cooling     |      BOILER      |
|---------------------|------------------|------------------|
|         29          |      Cooling     |      CAR_A       |
|---------------------|------------------|------------------|
|         29          |      Cooling     |      CAR_B       |
|---------------------|------------------|------------------|
|         29          |      Cooling     |      LINE1       |
|---------------------|------------------|------------------|

我需要它看起来像以下内容:

|---------------------|------------------|------------------|------------------|------------------|------------------|------------------|
|      DeviceUID      |     DeviceName   |     Node1        |      Node2       |       Node3      |       Node 4     |       Node5      |
|---------------------|------------------|------------------|------------------|------------------|------------------|------------------|
|         226         |      Boiler      |      BOILER      |     AMMONIA      |     CHILLER      |                  |                  |
|---------------------|------------------|------------------|------------------|------------------|------------------|------------------|
|         230         |      SSilo       |      SSUG        |     WALKER       |                  |                  |                  |
|---------------------|------------------|------------------|------------------|------------------|------------------|------------------|
|         29          |      Cooling     |      AMMONIA     |     BOILER       |     CAR_A        |       CAR_B      |       LINE1      |
|---------------------|------------------|------------------|------------------|------------------|------------------|------------------|

我确定我可以将其导出到Excel,进行修改,使其看起来像这样。但是我希望这是一个可重复的存储过程,可以用于当前数据集。

谢谢。

1 个答案:

答案 0 :(得分:0)

未经测试,但我们只是将PIVOT添加到您的初始查询中。

这还假定您具有已知或最大数量的节点。如果没有,则必须进行动态处理。

Select *
 From  ( 
        Select *
              ,Item = concat('Node',Row_Number() over (Partition By DeviceUID,DeviceName Order by (Select null))
         From (
                SELECT DISTINCT IP.DeviceUID, IP.DeviceName, d.NodeName from Devices d
                 inner join IPSCHEMA IP on IP.PLCIP=d.CommunicationAddress
              ) A
       ) src
 Pivot (max(NodeName) for Item in ([Node1],[Node2],[Node3],[Node4],[Node5]) ) pvt