0

ここに SQL Noob... この出力を生成する SQL クエリがあります。問題は、1 つの列にさまざまな種類のデータが含まれていることです。それらを異なる列に分ける必要があります。

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ここで使用して集計を実行できます(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
于 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 C | 6.5.2 | IB-1050-A |
| | ノード2 | +27.00 C | 6.5.2 | IB-550-A |
| | ノード3 | +26.50 C | 6.5.2 | IB-550-A |
| | ノード4 | +27.00 C | 6.5.2 | IB-550-A |
| | ノード5 | +27.80 C | 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 に答える