2013-04-29 84 views
0

学校我要项的特定子集的值的平均值,从平均所有这些值的减去表:从另一个减去一个查询的结果DB2

我想减去

SELECT AVG(gehalt) FROM mitarbeiter WHERE personalnummer IN (SELECT personalnummer FROM zertifiziert) 

SELECT AVG(gehalt) FROM mitarbeiter 

各异这些语句的工作,但我试图减去他们

SELECT (SELECT AVG(gehalt) FROM mitarbeiter) - (SELECT AVG(gehalt) FROM mitarbeiter WHERE personalnummer IN (SELECT personalnummer FROM zertifiziert)) 

SELECT mige-pige AS differenz FROM ((SELECT SUM(gehalt) AS mige FROM mitarbeiter) UNION (SELECT SUM(gehalt) AS pige FROM mitarbeiter WHERE personalnummer IN (SELECT personalnummer FROM zertifiziert))) 

没有,与DB2出现了意外的标记。我意识到这两个很可能是胡言乱语,那么正确的做法是什么?

+0

你的第一个查询是正确的我检查那么请你张贴这错误DB2回报。为了测试目的,我已在SQL Server中检查了您的第一个查询。 – Anvesh 2013-04-29 03:36:03

+0

感谢您的检查! 'DB2 => SELECT(选择AVG(gehalt)FROM mitarbeiter) - (SELECT AVG(gehalt)FROM mitarbeiter WHERE personalnummer IN(SELECT personalnummer FROM zertifiziert)) SQL0104N奥夫 “FROM zertifiziert))” folgte DAS unerwartete令牌 “END-OF-STATEMENT”。 Zu denmöglichenTokengehören:“”。 SQLSTATE = 42601' 它在德国,但我认为它得到了点 – 2013-04-29 03:40:51

+0

SQL0104N Auf“FROM zertifiziert))”? – Anvesh 2013-04-29 03:43:26

回答

0

你可以使用一个Common Table Expression (CTE)先计算平均值,然后在你的正常查询中使用它(热膨胀系数基本上都是内嵌视图):

WITH subset (average) AS (
    SELECT AVG(gehalt) 
    FROM mitarbeiter 
    WHERE personalnummer IN (
     SELECT personalnummer 
     FROM zertifiziert 
    ) 
) 

SELECT AVG(gehalt) - (SELECT average FROM subset) 
FROM mitarbeiter 

另外,我觉得你的第一个查询的工作,但你没有表格参考。与SQL Server不同(您可以在其中执行诸如SELECT CURRENT_USER之类的操作)或MySQL,您始终必须对表进行引用。在这种情况下,它会是SYSIBM.SYSDUMMY1表:

SELECT (SELECT AVG(gehalt) FROM mitarbeiter) 
- (SELECT AVG(gehalt) 
    FROM mitarbeiter 
    WHERE personalnummer IN (
     SELECT personalnummer 
     FROM zertifiziert)) 
FROM sysibm.sysdummy1 
+0

完美,这个作品!谢谢 – 2013-04-29 04:00:43

相关问题