2014-02-26 43 views
0

我是新来的SQL查询,并且已经被抛入了深层!如何将两个不同的查询组合成不同的输出到一个输出

我有两个需要合并在一起的查询。一个执行三个计算(总和为WGHours,计为WGCount,总和/计数为WGAvg)并将输出分为2列:工作组和优先级。其他执行相同的计算(PHours,PCOunt,PAVG而是由一列仅基 - 优先这是这样我就可以找到针对每个优先级的总图中,所以我可以最后划分WGAvg/PAVG以产生一个%

我可以单独创建两个查询,但需要将两者的输出合并在一起,以便我可以在一个表中使用它们。我试过UNION ALL,但它不会生成我需要的输出,这是:

WORK_GROUP, PRIORITY, WGHOURS, WGCount, WGAvg, PHours, PCount, PAvg 

任何想法我如何做到这一点?我试过使用一个解决办法,我在这里找到,但得到的Oracle错误,告诉我该命令没有正确地结束

SELECT One.OPriority, 
     WorkGroup, 
     AverageHours, 
     WoCount, 
     Divis 
FROM (Select CORVU.MSV620.ORIG_PRIORITY as OPriority, 
      CORVU.MSV620.WORK_GROUP as WorkGroup, 
      SUM(CORVU.MSV621.ACT_LAB_HRS) AS AverageHours, 
      COUNT(CORVU.MSV621.WORK_ORDER) AS WoCount, 
      CAST(SUM(CORVU.MSV621.ACT_LAB_HRS)/COUNT(CORVU.MSV621.WORK_ORDER) AS DECIMAL (38, 2)) AS Divis 
    FROM CORVU.MSV620, CORVU.MSV621 
    WHERE CORVU.MSV620.WORK_ORDER = CORVU.MSV621.WORK_ORDER 
    GROUP BY CORVU.MSV620.ORIG_PRIORITY, CORVU.MSV620.WORK_GROUP) AS one 
JOIN (
     SELECT CORVU.MSV620.ORIG_PRIORITY as OPriority, 
     CAST(SUM(CORVU.MSV621.ACT_LAB_HRS)/COUNT(CORVU.MSV621.WORK_ORDER) AS DECIMAL (38, 2)) AS DivisOP 
     FROM  CORVU.MSV620, CORVU.MSV621 
     WHERE CORVU.MSV620.WORK_ORDER = CORVU.MSV621.WORK_ORDER AND (CORVU.MSV620.WORK_GROUP IN ('ENGA01', 'ENGA02', 'ENGA04', 'ENGA05', 'ENGA06', 
      'ENGA08')) AND (CORVU.MSV620.ACCOUNT_CODE LIKE '%B01%') AND (CORVU.MSV621.ACT_LAB_HRS > 0) AND (NOT (CORVU.MSV620.STD_JOB_NO IN ('ELE995', 
      'MEC995', 'ICA995'))) AND (CORVU.MSV620.ORIG_PRIORITY IN ('CH', 'CS', 'T0', 'T1', 'T2', 'T3', 'T4')) AND 
      (CORVU.MSV620.CLOSED_DT >= TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), - 1), 'yyyymmdd')) AND 
      (CORVU.MSV620.CLOSED_DT <= TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE + 30, 'MONTH') - 1, - 1), 'yyyymmdd')) 
     GROUP BY CORVU.MSV620.ORIG_PRIORITY) as two 
WHERE  one.CORVU.MSV620.ORIG_PRIORITY = two.CORVU.MSV620.ORIG_PRIORITY;   
+0

哪个dbms? Oracle或sql服务器? – JiggsJedi

回答

0

尝试使用第二查询作为一个字段使用(子)选择,就像这样:

select a.name, a.address, sum(a.xxx), 
(select avg(b.amount) from costs b where b.id=a.id) 
from clients a 
where ... ; 
2

在您的查询中,您正在使用join。这然后期望on子句而不是where子句。这可能会解决您的问题:

SELECT One.OPriority, 
     WorkGroup, 
     AverageHours, 
     WoCount, 
     Divis 
FROM (Select CORVU.MSV620.ORIG_PRIORITY as OPriority, 
      CORVU.MSV620.WORK_GROUP as WorkGroup, 
      SUM(CORVU.MSV621.ACT_LAB_HRS) AS AverageHours, 
      COUNT(CORVU.MSV621.WORK_ORDER) AS WoCount, 
      CAST(SUM(CORVU.MSV621.ACT_LAB_HRS)/COUNT(CORVU.MSV621.WORK_ORDER) AS DECIMAL (38, 2)) AS Divis 
    FROM CORVU.MSV620, CORVU.MSV621 
    WHERE CORVU.MSV620.WORK_ORDER = CORVU.MSV621.WORK_ORDER 
    GROUP BY CORVU.MSV620.ORIG_PRIORITY, CORVU.MSV620.WORK_GROUP) one 
------------------------------------------------------------------^ 
JOIN (
     SELECT CORVU.MSV620.ORIG_PRIORITY as OPriority, 
     CAST(SUM(CORVU.MSV621.ACT_LAB_HRS)/COUNT(CORVU.MSV621.WORK_ORDER) AS DECIMAL (38, 2)) AS DivisOP 
     FROM  CORVU.MSV620, CORVU.MSV621 
     WHERE CORVU.MSV620.WORK_ORDER = CORVU.MSV621.WORK_ORDER AND (CORVU.MSV620.WORK_GROUP IN ('ENGA01', 'ENGA02', 'ENGA04', 'ENGA05', 'ENGA06', 
      'ENGA08')) AND (CORVU.MSV620.ACCOUNT_CODE LIKE '%B01%') AND (CORVU.MSV621.ACT_LAB_HRS > 0) AND (NOT (CORVU.MSV620.STD_JOB_NO IN ('ELE995', 
      'MEC995', 'ICA995'))) AND (CORVU.MSV620.ORIG_PRIORITY IN ('CH', 'CS', 'T0', 'T1', 'T2', 'T3', 'T4')) AND 
      (CORVU.MSV620.CLOSED_DT >= TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), - 1), 'yyyymmdd')) AND 
      (CORVU.MSV620.CLOSED_DT <= TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE + 30, 'MONTH') - 1, - 1), 'yyyymmdd')) 
     GROUP BY CORVU.MSV620.ORIG_PRIORITY) two 
---------------------------------------------^ 
     on one.CORVU.MSV620.ORIG_PRIORITY = two.CORVU.MSV620.ORIG_PRIORITY; 
------^ was WHERE 

编辑:

我也去掉了as(因为你已经在注释中说明)。 Oracle不允许as用于表别名。

+0

感谢您的帮助 - 但我仍然收到一个错误,告诉我该命令未正确结束。这来自Oracle SQl开发人员15. –

+0

@NeilDeeley。 。 。在这种情况下,首先单独运行每个子查询以确保它们在语法上是正确的。结合它们的结构看起来不错。 –

+0

@NeilDeeley。 。 。我可能猜测你想要一个“左外连接”或“完全外连接”。 –

相关问题