为什么我被迫使用MAX()以及如何重写代码?

时间:2015-01-27 12:04:45

标签: sql max

我有一个包含列的表:

EGAIT1  EGACAM      EGVONO
2440     -18242,39  1416341
6995      18242,39  1416341
2995      18242,39  1416341
6995     -18242,39  1416341
2995      18242,39  1416341
2995     -18242,39  1416341

我希望查询查看包含帐户2995或6995的会计行是否将upp添加为零,如果不是,我希望问题返回不加零的帐户数和差值之和金额。

我的查询如下:

SELECT 
MAX(FGLEDG.EGAIT1),
SUM(FGLEDG.EGACAM)

FROM SEUHABOB.MVXADTA001.FGLEDG FGLEDG

WHERE (FGLEDG.EGAIT1 IN ('2995','6995'))
AND (FGLEDG.EGVONO=1416341)

GROUP BY FGLEDG.EGVONO
HAVING SUM(FGLEDG.EGACAM) <> 0

问题在于,由于我被迫使用MAX(FGLEDG.EGAIT1),问题会重新调整错误的帐号。

是否有某种方法可以“拆分”WHERE条件,以便每个帐户执行一次,每次执行只执行returns MAX(FGLEDG.EGAIT1)

(我当时试图只使用一个帐户,然后它不返回6995,这是正确的,2995 18242,39返回2995,也是正确的。)

我的预期结果是:

EGAIT1    EGACAM      
2440     -18242,39  
6995      18242,39  

3 个答案:

答案 0 :(得分:0)

SELECT FGLEDG.EGAIT1, SUM(FGLEDG.EGACAM)
FROM SEUHABOB.MVXADTA001.FGLEDG FGLEDG
WHERE (FGLEDG.EGAIT1 IN ('2995','6995'))
GROUP BY FGLEDG.EGAIT1
HAVING SUM(FGLEDG.EGACAM) != 0

仅仅是问题是必须为EGAIT1进行分组,以便在没有MAX的情况下使用它。


(改变后的问题)

可能需要以下组合分组:

SELECT FGLEDG.EGVONO, FGLEDG.EGAIT1, SUM(FGLEDG.EGACAM)
FROM SEUHABOB.MVXADTA001.FGLEDG FGLEDG
WHERE FGLEDG.EGAIT1 IN ('2995','6995')
GROUP BY FGLEDG.EGVONO, FGLEDG.EGAIT1
HAVING SUM(FGLEDG.EGACAM) != 0

答案 1 :(得分:0)

假设您只对这两个帐户2995和6995感兴趣,您可以执行以下操作:

SELECT FGLEDG.EGAIT1, SUM(FGLEDG.EGACAM), FGLEDG.EGVONO

FROM SEUHABOB.MVXADTA001.FGLEDG FGLEDG

WHERE (FGLEDG.EGAIT1 in ('2995', '6995')
AND FGLEDG.EGVONO=1416341)

GROUP BY FGLEDG.EGVONO, FGLEDG.EGAIT1
HAVING SUM(FGLEDG.EGACAM) <> 0

答案 2 :(得分:0)

如果我理解正确,您只想在两个指定帐户不为零时输出数据。如果是这样,那么您可以使用窗口/分析函数来为这些&#34;帐户&#34;添加值。在子查询中:

SELECT EGVONO, EGAIT1, cnt, sum_EGACAM
FROM (SELECT EGVONO, EGAIT1, COUNT(*) as cnt, SUM(EGACAM) as sum_EGACAM,
             SUM(SUM(CASE WHEN F.EGAIT1 IN ('2995', '6995') THEN EGACAM END)) OVER (PARTITION BY EGVONO) as sum_2995_6995
      FROM SEUHABOB.MVXADTA001.FGLEDG F
      GROUP BY FGLEDG.EGVONO, EGAIT1
     ) x
WHERE sum_2995_6995 = 0