0

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
.
.
.

更改为这种格式的最佳方法是什么?我会从初始查询中创建一个视图并创建一个新的 SELECT FROM WHERE 语句吗?

我不确定如何获取“HardwareType”之类的字段并将其设为名为 Hardware Type 的列,并将相应的 STATUS 值放置到不同的列中。似乎需要某种条件,例如 CASE。

有什么想法可以为我指明正确的方向吗?

谢谢。

4

3 回答 3

2

您可以CASE在此处使用并执行聚合(如MINor MAX):

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
于 2013-01-24T16:39:11.137 回答
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 

结果

| 节点名 | 温度 | 新版本 | 硬件类型 |
-------------------------------------------------- --
| 节点1 | +27.20 摄氏度 | 6.5.2 | IB-1050-A |
| 节点2 | +27.00 摄氏度 | 6.5.2 | IB-550-A |
| 节点3 | +26.50 摄氏度 | 6.5.2 | IB-550-A |
| 节点4 | +27.00 摄氏度 | 6.5.2 | IB-550-A |
| 节点5 | +27.80 摄氏度 | 6.5.2 | IB-1050-A |
| 节点6 | (空) | 6.5.2 | IB-1410 |

查看演示

于 2013-01-24T16:42:51.627 回答
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

于 2013-01-24T16:51:25.403 回答