2016-08-04 3 views
-1

を組み合わせるヘルプ。クエリ1は、すべてのノード(Nodes.Caption)のマスターリストを調べます。ただし、要求されたデータ(ネットワークトラフィック)はすべてのノードに存在しません。ネットワークトラフィックをInterfaceTrafficテーブル(クエリ1を参照)から取得するために、結合クエリを使用したいと思います。ただし、このテーブルに既存のデータがない場合は、VIM_VMStatisticsテーブル(クエリ2)からデータを取得します。は、私は2つのクエリを組み合わせる助けが必要なクエリ

クエリ1

SELECT Caption 
    ,Round(InAVG, 2) AS NetInAverage_Kbps 
    ,Round(InMAX, 2) AS NetInMax_Kbps 
    ,Round(OutAVG, 2) AS NetOutAverage_Kbps 
    ,Round(OutMAX, 2) AS NetOutMax_Kbps 
FROM (
    SELECT caption 
     ,nodeid 
    FROM Nodes 
    ) n 
INNER JOIN (
    SELECT nodeid 
     ,AVG(In_Averagebps)/1024 AS InAVG 
     ,MAX(In_Maxbps)/1024 AS InMAX 
     ,AVG(Out_Averagebps)/1024 AS OutAVG 
     ,MAX(Out_Maxbps)/1024 AS OutMAX 
    FROM InterfaceTraffic 
    WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0) 
     AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0) 
    GROUP BY nodeid 
    ) l ON n.NodeID = l.NodeID 
ORDER BY Caption 

クエリ2

SELECT NAME 
    ,Round(InAVG, 2) AS NetInAverage_Kbps 
    ,Round(InMAX, 2) AS NetInMax_Kbps 
    ,Round(OutAVG, 2) AS NetOutAverage_Kbps 
    ,Round(OutMAX, 2) AS NetOutMax_Kbps 
FROM (
    SELECT NAME 
     ,VirtualMachineID 
      ,NodeID 
    FROM VIM_VirtualMachineNodes 
    ) n 
INNER JOIN (
    SELECT VirtualMachineID 
     ,AVG(AvgNetworkReceiveRate) AS InAVG 
     ,MAX(MaxNetworkReceiveRate) AS InMAX 
     ,AVG(AvgNetworkTransmitRate) AS OutAVG 
     ,MAX(MaxNetworkTransmitRate) AS OutMAX 
    FROM VIM_VMStatistics 
    WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0) 
     AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0) 
    GROUP BY VirtualMachineID 
    ) l ON n.VirtualMachineID = l.VirtualMachineID 
+3

* *キャプション、NODEID、名前、virtualmachineidとの関係は何であるか – Siyual

+1

...提出する前に、あなたのポストをプレビューしてください - 関係がない場合は、それらを結合する方法はありません。あなたは私たちに関係を教えてくれませんでした - 私たちはそれらを組み合わせることができるようにする必要があります。 – Hogan

+0

は私はありませんが、NodesテーブルとVIM_VirtualMachineNodesの両方に存在するノードidを追加するのを忘れ。ただし、vim_vimstatisticsではnodeidは存在しません。このテーブルには、virtualmachineid – mprobus

答えて

0

これらのかわいいサブ選択のための必要はありません。これは私がVIM_VirtualMachineNodesが


これを行うにはいくつかの方法がありますが、これは私が考える方法であるノードのようなノードidフィールドを持っていると仮定するつもりだとまったく同じ

SELECT n.Caption 
    ,Round(InAVG, 2) AS NetInAverage_Kbps 
    ,Round(InMAX, 2) AS NetInMax_Kbps 
    ,Round(OutAVG, 2) AS NetOutAverage_Kbps 
    ,Round(OutMAX, 2) AS NetOutMax_Kbps 
FROM Nodes n 
INNER JOIN (
    SELECT nodeid 
     ,AVG(In_Averagebps)/1024 AS InAVG 
     ,MAX(In_Maxbps)/1024 AS InMAX 
     ,AVG(Out_Averagebps)/1024 AS OutAVG 
     ,MAX(Out_Maxbps)/1024 AS OutMAX 
    FROM InterfaceTraffic 
    WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0) 
    AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0) 
    GROUP BY nodeid 
) l ON n.NodeID = l.NodeID 
ORDER BY Caption 

SELECT n.NAME 
    ,Round(InAVG, 2) AS NetInAverage_Kbps 
    ,Round(InMAX, 2) AS NetInMax_Kbps 
    ,Round(OutAVG, 2) AS NetOutAverage_Kbps 
    ,Round(OutMAX, 2) AS NetOutMax_Kbps 
FROM VIM_VirtualMachineNodes n 
INNER JOIN (
    SELECT VirtualMachineID 
     ,AVG(AvgNetworkReceiveRate) AS InAVG 
     ,MAX(MaxNetworkReceiveRate) AS InMAX 
     ,AVG(AvgNetworkTransmitRate) AS OutAVG 
     ,MAX(MaxNetworkTransmitRate) AS OutMAX 
    FROM VIM_VMStatistics 
    WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0) 
    AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0) 
    GROUP BY VirtualMachineID 
) l ON n.VirtualMachineID = l.VirtualMachineID 

に動作します

まずあなたが問題ではノード識別子のリストを必要とする....最も明確です。

SELECT DISTINCT nodeid 
FROM (
    SELECT nodeid from nodes 
    UNION ALL 
    SELECT nodeid from VIM_VirtualMachineNodes 
) as node_list 

は今、我々は二つのリストにこれを参加して、あなたは私が名前を気にしませんでした見ることができますが、サブのものに参加することができたよう

SELECT 
    COALESCE(l1.nodeid, l2.nodeid, 0) as nodeid, 
    COALESCE(l1.InAVG, l2.InAVE, 0.0) AS NetInAverage_Kbps, 
    COALESCE(l1.InMAX, l2.InMAX, 0.0) AS NetInMax_Kbps, 
    COALESCE(l1.OutAVG, l1.OutAVG, 0.0) AS NetOutAverage_Kbps, 
    COALESCE(l1.OutMAX, l1.OutMAX, 0.0) AS NetOutMax_Kbps 
FROM (
    SELECT DISTINCT nodeid 
    FROM (
    SELECT nodeid from nodes 
    UNION ALL 
    SELECT nodeid from VIM_VirtualMachineNodes 
) as node_list 
) as N 
LEFT JOIN (
    SELECT nodeid 
     ,AVG(In_Averagebps)/1024 AS InAVG 
     ,MAX(In_Maxbps)/1024 AS InMAX 
     ,AVG(Out_Averagebps)/1024 AS OutAVG 
     ,MAX(Out_Maxbps)/1024 AS OutMAX 
    FROM InterfaceTraffic 
    WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0) 
    AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0) 
    GROUP BY nodeid 
) l1 ON n.NodeID = l1.NodeID 
LEFT JOIN (
    SELECT nodeid 
     ,AVG(AvgNetworkReceiveRate) AS InAVG 
     ,MAX(MaxNetworkReceiveRate) AS InMAX 
     ,AVG(AvgNetworkTransmitRate) AS OutAVG 
     ,MAX(MaxNetworkTransmitRate) AS OutMAX 
    FROM VIM_VMStatistics 
    WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0) 
    AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0) 
    GROUP BY VirtualMachineID 
) l2 ON n.NodeID = l2.NodeID 

を合体使用してアイテムを選択し、左あなたが望むなら - クエリー。あなたは左の外側にノード上でクエリを行うことができ

0

はQuery1をしてQUERY2に合流します。

  1. あなたはノードのキャプション

あたり最大1つの行でQuery1をとQUERY2リターンはその後、クエリは次のように見えることQuery1をしてQUERY2

  • のための景色を眺めることができます:簡単にするために、我々は仮定

    SELECT caption, 
         (CASE WHEN Q1.Caption IS NULL THEN Q2.NetInAverage_Kbps 
          ELSE Q1.NetInAverage_Kbps END) AS NetInAverage_Kpbs, 
         (CASE WHEN Q1.Caption IS NULL THEN Q2.NetInMax_Kbps 
          ELSE Q1.NetInMax_Kbps END) AS NetInMax_Kbps, 
         (CASE WHEN Q1.Caption IS NULL THEN Q2.NetOutAverage_Kbps 
          ELSE Q1.NetOutAverage_Kbps END) AS NetOutAverage_Kbps, 
         (CASE WHEN Q1.Caption IS NULL THEN Q2.NetOutMax_Kbps 
          ELSE Q1.NetOutAverage_Kbps END) AS NetOutMax_Kbps 
    FROM Nodes N 
        LEFT OUTER JOIN Query1 Q1 ON N.Caption=Q1.Caption 
        LEFT OUTER JOIN Query2 Q2 ON N.Caption=Q2.Name 
    

    このクエリのチェックは、QUERY2は、使用他にQuery1をされていない場合、Query1をで見つかった行がある場合。

  • 関連する問題