【问题标题】:Merging 3 sql views into 1 query using a look up table SQL使用查找表 SQL 将 3 个 sql 视图合并为 1 个查询
【发布时间】:2017-09-18 15:08:02
【问题描述】:

我需要将 3 个不同查询的估计时间分钟加到 1 个 sql 查询中。 我有 3 个视图(一个用于在机器 A 上按作业切割的零件,一个用于在机器 B 上按作业切割的零件,以及在机器 C 上按作业切割的零件)。我有另一个表,其中列出了所有具有估计切割时间的零件,我们将其称为 TableA。我已经编写了三个不同的查询,使用将连接留在 TableA 上的视图来汇总切割时间。但是,我想要一个查询,该查询返回一个表,其中包含作业列表和机器每个作业的估计切割时间。因此,每一行都会有工作,然后是每台机器分解的三个估计切割时间。

 --------Machine A-------
 SELECT 
 sum(TableA.[minutes]) as 'total', MachineA.JobNum
 FROM MachineA
 LEFT JOIN TableA on
 TableA.Part = MachineA.PART
 WHERE TableA.OP = 10 and OP_DISABLE IS NULL
 group by MachineA.Job

 --------Machine B-------
 SELECT 
 sum(TableA.[minutes]) as 'total', MachineB.JobNum
 FROM MachineB
 LEFT JOIN TableA on
 TableA.Part = MachineB.PART
 WHERE TableA.OP = 10 and OP_DISABLE IS NULL
 group by MachineB.Job

 --------Machine C-------
 SELECT 
 sum(TableA.[minutes]) as 'total', MachineC.JobNum
 FROM MachineC
 LEFT JOIN TableA on
 TableA.Part = MachineC.PART
 WHERE TableA.OP = 10 and OP_DISABLE IS NULL
 group by MachineC.Job

我正在寻找的示例表

 Job | MachinA_Time | MachineB_Time | MachineC_Time|
 ----------------------------------------------------
 123 | 345          | 512           | 452          |
 124 | 215          | 351           | 356

【问题讨论】:

  • 只是加入工作#?
  • @long 加入工作是什么意思?我如何将所有这些都整合到一个查询中?
  • 感谢大家的回复,我真的很感激。我将运行所有 3 个解决方案,并确保它们都能正常工作并发表评论。

标签: sql select sum


【解决方案1】:

使用UNION,您可以这样做:

SELECT JobNum
  ,MAX(MachinA_Time) AS MachinA_Time
  ,MAX(MachinB_Time) AS MachinB_Time
  ,MAX(MachinC_Time) AS MachinC_Time
FROM
(

    SELECT MachineA.JobNum, sum(TableA.[minutes]) as MachinA_Time, NULL AS MachinB_Time, NULL AS MachinA_Time
     FROM MachineA 
    LEFT JOIN TableA on TableA.Part = MachineA.PART
     WHERE TableA.OP = 10 and OP_DISABLE IS NULL
     group by MachineA.Job
    UNION ALL
     SELECT MachineB.JobNum, NULL, sum(TableA.[minutes]), NULL
     FROM MachineB
     LEFT JOIN TableA on
     TableA.Part = MachineB.PART
     WHERE TableA.OP = 10 and OP_DISABLE IS NULL
     group by MachineB.Job
    UNION ALL
     SELECT MachineC.JobNum, NULL, NULL, sum(TableA.[minutes])
     FROM MachineC
     LEFT JOIN TableA on
     TableA.Part = MachineC.PART
     WHERE TableA.OP = 10 and OP_DISABLE IS NULL
     group by MachineC.Job

) AS t
GROUP BY JobNum

【讨论】:

    【解决方案2】:

    我认为您可以通过使用条件聚合和 UNION 来节省不必要的连接,因为格式是相同的

    SELECT p.jobnum,
           SUM(CASE WHEN t.machine = 'A' THEN t.[minutes] END) as machineA_Time,
           SUM(CASE WHEN t.machine = 'B' THEN t.[minutes] END) as machineB_Time,
           SUM(CASE WHEN t.machine = 'C' THEN t.[minutes] END) as machineC_Time
    FROM(SELECT s.minutes,s.part,'A' as machine FROM MachineA s
         UNION ALL 
         SELECT s.minutes,s.part,'B' FROM MachineB s
         UNION ALL 
         SELECT s.minutes,s.part,'C' FROM MachineC s) t
    JOIN TableA p
     ON(p.part = t.part)
    WHERE p.op = 10
    GROUP BY p.jobnum
    

    这个查询可能需要一些额外的调整,因为我不知道OP_DISABLE IS NULL来自哪里。

    【讨论】:

      【解决方案3】:

      只需根据共享作业加入每个结果#:

      WITH MachineA
      AS
      (
       SELECT 
       sum(TableA.[minutes]) as 'total', MachineA.JobNum
       FROM MachineA
       LEFT JOIN TableA on
       TableA.Part = MachineA.PART
       WHERE TableA.OP = 10 and OP_DISABLE IS NULL
       group by MachineA.Job
       ),
       MachineB
       as
       (-
       SELECT 
       sum(TableA.[minutes]) as 'total', MachineB.JobNum
       FROM MachineB
       LEFT JOIN TableA on
       TableA.Part = MachineB.PART
       WHERE TableA.OP = 10 and OP_DISABLE IS NULL
       group by MachineB.Job
       ),
        MachineC
       as
      (
       SELECT 
       sum(TableA.[minutes]) as 'total', MachineC.JobNum
       FROM MachineC
       LEFT JOIN TableA on
       TableA.Part = MachineC.PART
       WHERE TableA.OP = 10 and OP_DISABLE IS NULL
       group by MachineC.Job
       )
      
       SELECT A.JobNum as Job, MachineA.total as MachineATime,  MachineB.total as MachineBTime, MachineC.total as MachineCTime
       FROM MachineA as A
       INNER JOIN MachineB as B
       ON B.JobNum = A.JobNum
       INNER JOIN MachineC as C
       ON C.JobNum = A.JobNum
      

      【讨论】:

      • 是的,我只是用最笨的方式xD,你的方式优雅精致xD
      • @Cheddar,np,但您可能会寻求一种更有效的方法,例如从一个查询中获取输出,就像其他人的答案一样。
      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多