2017-05-25 15 views
0

私は2つのselectステートメントを持っています。過去60秒間に記録された電圧データのリスト(もしあれば)および関連するチャンバ名を取得し、過去5分間に記録されたアークイベントデータのリスト(もしあれば)を取得する。アークカウントデータを新しい列として電圧データテーブルに追加しようとしています。私はこれを行う方法を理解することはできません。SQLユニオン/ジョイント/交差複数選択ステートメント

電圧データテーブルにある所与のチャンバ名に対して、アークカウント行が存在してもいなくてもよいことに留意されたい。行がない場合は、円弧数の列の値をゼロに設定する必要があります。

これを達成するためのアイデアはありますか?

電圧データ:

SELECT DISTINCT dbo.CoatingChambers.Name, 
AVG(dbo.CoatingGridVoltage_Data.ChanA_DCVolts) AS ChanADC,    
AVG(dbo.CoatingGridVoltage_Data.ChanB_DCVolts) AS ChanBDC, 
AVG(dbo.CoatingGridVoltage_Data.ChanA_RFVolts) AS ChanARF, 
AVG(dbo.CoatingGridVoltage_Data.ChanB_RFVolts) AS ChanBRF FROM 
dbo.CoatingGridVoltage_Data LEFT OUTER JOIN dbo.CoatingChambers ON 
dbo.CoatingGridVoltage_Data.CoatingChambersID = 
dbo.CoatingChambers.CoatingChambersID WHERE 
(dbo.CoatingGridVoltage_Data.DT > DATEADD(second, - 60, 
SYSUTCDATETIME())) GROUP BY dbo.CoatingChambers.Name 

戻り

Name |  ChanADC  |  ChanBDC  |  ChanARF  |  ChanBRF 
-----+-------------------+--------------------+---------------------+------------------ 
OX2 | 2.9099999666214 | -0.485000004371007 | 0.344801843166351 | 0.49748428662618 
S2 | 0.100000001490116 | -0.800000016887983 | 0.00690172302226226 | 0.700591623783112 
S3 | 4.25666658083598 | 0.5    | 0.96554297208786 | 0.134956782062848 

アークカウントテーブル:

SELECT CoatingChambers.Name, 
SUM(ArcCount) as ArcCount 
FROM CoatingChambers 
LEFT JOIN CoatingArc_Data 
ON dbo.[CoatingArc_Data].CoatingChambersID = dbo.CoatingChambers.CoatingChambersID 
where EventDT > DATEADD(mi,-5, GETDATE()) 
Group by Name 

戻り

Name | ArcCount 
-----+--------- 
L1 | 283 
L4 |  0 
L6 |  1 
S2 | 55 

明確にするために、私はこのテーブルをしたい(追加されたアークでカラムをカウント)、上記の二つのテーブル与えられた:

Name |  ChanADC  |  ChanBDC  |  ChanARF  | ChanBRF   | ArcCount 
-----+-------------------+--------------------+---------------------+-------------------+--------- 
OX2 | 2.9099999666214 | -0.485000004371007 | 0.344801843166351 | 0.49748428662618 | 0 
S2 | 0.100000001490116 | -0.800000016887983 | 0.00690172302226226 | 0.700591623783112 | 55 
S3 | 4.25666658083598 | 0.5    | 0.96554297208786 | 0.134956782062848 | 0 

答えて

1

あなたは仮想テーブルとしてSELECT文を扱い、ちょうどそれらを一緒に参加することができます:

select 
    x.Name, 
    x.ChanADC, 
    x.ChanBDC, 
    x.ChanARF, 
    x.ChanBRF, 
    isnull(y.ArcCount, 0) ArcCount 
from 
(
    select distinct 
    cc.Name, 
    AVG(cgv.ChanA_DCVolts) AS ChanADC,  
    AVG(cgv.ChanB_DCVolts) AS ChanBDC, 
    AVG(cgv.ChanA_RFVolts) AS ChanARF, 
    AVG(cgv.ChanB_RFVolts) AS ChanBRF 
    from 
    dbo.CoatingGridVoltage_Data cgv 
     left outer join 
    dbo.CoatingChambers cc 
     on 
     cgv.CoatingChambersID = cc.CoatingChambersID 
    where 
    cgv.DT > dateadd(second, - 60, sysutcdatetime()) 
    group by 
    cc.Name 
) as x 

    left outer join 

(
    select 
    cc.Name, 
    sum(ac.ArcCount) as ArcCount 
    from 
    dbo.CoatingChambers cc 
     left outer join 
    dbo.CoatingArc_Data ac 
     on 
     ac.CoatingChambersID = cc.CoatingChambersID 
    where 
    EventDT > dateadd(mi,-5, getdate()) 
    group by 
    Name  
) as y 

    on 
    x.Name = y.Name 

また、エイリアスを使って名前を簡略化し、読みやすくするためにクエリのフォーマットを設定することは価値があります。私は恥知らずにそれを刺しました。

+0

あなたのお時間をありがとうございます。 isnull()は私にとっては新しいものです。私は何とか仮想テーブルに参加しようとしたときに失敗しました... –

+0

喜んで助けてください:-) – Clay