SQL:将一列中的数据移动到不同的列

时间:2013-01-24 16:34:38

标签: sql case

SQL Noob here ...我有一个产生此输出的SQL查询。问题是一列包含不同类型的数据。我需要将它们分成不同的列。

NODENAME MIB                STATUS
Node1    CPUTemperature     +27.20 C
Node2    CPUTemperature     +27.00 C
Node3    CPUTemperature     +26.50 C
node4    CPUTemperature     +27.00 C
node5    CPUTemperature     +27.80 C
node1    NiosVersion        6.5.2
node2    NiosVersion        6.5.2
node3    NiosVersion        6.5.2
node4    NiosVersion        6.5.2
node5    NiosVersion        6.5.2
node6    NiosVersion        6.5.2
node1    HardwareType       IB-1050-A
node2    HardwareType       IB-550-A
node3    HardwareType       IB-550-A
node4    HardwareType       IB-550-A
node5    HardwareType       IB-1050-A
node6    HardwareType       IB-1410

我想将表修改为:

Node Name   Temp    NiosVersion HardwareType
Node1       +27.20  6.5.2       IB-1050-A
Node2       +27     6.5.2       IB-550-A
Node3       +26.50  6.5.2       IN-550-A
.
.
.

更改为此格式的最佳方法是什么?我是否可以从初始查询中创建一个VIEW并创建一个新的SELECT FROM WHERE语句?

我不确定如何使用类似“HardwareType”的字段并将其设为名为Hardware Type的列,并将相应的STATUS值放在不同的列中。看起来像CASE需要某种条件。

有任何想法指出我正确的方向吗?

感谢。

3 个答案:

答案 0 :(得分:2)

您可以在此处使用CASE并执行汇总(例如MINMAX):

SELECT  NODENAME,
        MIN(CASE WHEN MIB = 'CPUTemperature' THEN Status END) AS Temp,
        MIN(CASE WHEN MIB = 'NiosVersion' THEN Status END) AS NiosVersion,
        MIN(CASE WHEN MIB = 'HardwareType' THEN Status END) AS HardwareType
FROM (...Your Query Here...) Data
GROUP BY NODENAME

答案 1 :(得分:2)

这就是我要做的事情:

SELECT a.nodename, 
       b.status AS 'Temp', 
       c.status AS 'NiosVersion', 
       d.status AS 'HardwareType' 
FROM   (SELECT DISTINCT nodename 
        FROM   nodes) a 
       LEFT JOIN (SELECT nodename, 
                         status 
                  FROM   nodes 
                  WHERE  mib = 'CPUTemperature') b 
              ON b.nodename = a.nodename 
       LEFT JOIN (SELECT nodename, 
                         status 
                  FROM   nodes 
                  WHERE  mib = 'NiosVersion') c 
              ON c.nodename = a.nodename 
       LEFT JOIN (SELECT nodename, 
                         status 
                  FROM   nodes 
                  WHERE  mib = 'HardwareType') d 
              ON d.nodename = a.nodename 

<强>结果

| NODENAME |     TEMP | NIOSVERSION | HARDWARETYPE |
----------------------------------------------------
|    node1 | +27.20 C |       6.5.2 |    IB-1050-A |
|    node2 | +27.00 C |       6.5.2 |     IB-550-A |
|    node3 | +26.50 C |       6.5.2 |     IB-550-A |
|    node4 | +27.00 C |       6.5.2 |     IB-550-A |
|    node5 | +27.80 C |       6.5.2 |    IB-1050-A |
|    node6 |   (null) |       6.5.2 |      IB-1410 |

See a demo

答案 2 :(得分:1)

根据您使用的RDBMS,可以使用PIVOT函数完成此操作。 SQL Server 2005+和Oracle 11g +都具有此功能。

查询将是:

select *
from
(
  select nodename, MIB, status
  from yourtable
) src
pivot
(
  max(status)
  for mib in (CPUTemperature, NiosVersion, HardwareType)
) piv

请参阅SQL Fiddle with Demo