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需要某种条件。
有任何想法指出我正确的方向吗?
感谢。
答案 0 :(得分:2)
您可以在此处使用CASE
并执行汇总(例如MIN
或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
答案 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 |
答案 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