【问题标题】:SQL union / join / intersect multiple select statementsSQL union/join/intersect 多条select语句
【发布时间】:2017-05-25 16:30:35
【问题描述】:

我有两个选择语句。一个人获得过去 60 秒内记录的电压数据和相关腔室名称的列表(如果有),一个人获得过去 5 分钟内记录的电弧事件数据的列表(如果有)。我正在尝试将电弧计数数据作为新列附加到电压数据表中。我不知道该怎么做。

请注意,对于电压数据表中的给定腔室名称,可能有也可能没有电弧计数行。如果没有行,我想将弧计数列值设置为零。

关于如何实现这一点的任何想法?

电压数据:

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

【问题讨论】:

    标签: sql select join union intersect


    【解决方案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
    

    此外,使用别名简化您的名称并格式化查询以提高可读性是值得的……我无耻地尝试了这一点。

    【讨论】:

    • 太棒了,感谢您的宝贵时间。 isnull() 对我来说是新的。当我尝试加入虚拟表时,我以某种方式失败了......
    • 很高兴为您提供帮助 :-)
    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2021-05-10
    • 2014-12-18
    相关资源
    最近更新 更多