【问题标题】:Check this SQL query检查此 SQL 查询
【发布时间】:2015-06-03 11:28:40
【问题描述】:
select a.LOB, SUM(a.GPW) AS XGPW,SUM(b.GPW) AS YGPW,SUM(a.GPW) - SUM(b.GPW)     AS GPW_DIFF 
FROM SDSS.DSS_SALES_PRODUCTION_DTLS a,

SDSS.DSS_SALES_PRODUCTION_DTLS b 
where a.LOB = b.LOB and
a.account_year=2014 and b.account_year=2015
GROUP BY a.LOB

我想打印 2014 年和 2015 年生成的总 GPW。在 Db 中,我每个月都有单独的 GPW 值等,我想将它们全部相加。对于 2014 年,总和是正确的,但对于 2015 年则不正确。请提出建议

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。
  • 如果您需要任何其他信息,请发表评论
  • a.account_year=2014 and b.account_year=2015 - 这永远不会是真的,因为account_year 不能同时包含 2014 和 2015。你可能想看看那个......
  • 先生,同一张表包含 2014 年和 2015 年的 GPW。我试图从 a 中选择 2014 年的一个,从 b 中选择 2015 年

标签: sql oracle sum toad


【解决方案1】:

最好使用 CASEes,而不是两次加入同一个表:

SELECT LOB, XGPW, YGPW, XGPW - YGPW AS GPW_DIFF 
from 
 (
   select LOB, 
      SUM(CASE WHEN account_year=2014 THEN a.GPW ELSE 0 END) AS XGPW,
      SUM(CASE WHEN account_year=2015 THEN a.GPW ELSE 0 END) AS YGPW,
   FROM SDSS.DSS_SALES_PRODUCTION_DTLS
   where account_year in (2014, 2015)
   GROUP BY LOB
 ) dt

【讨论】:

  • 请去掉别名a否则会报错!
  • 是的,你应该因为速度更快而获得 +1 ;)
【解决方案2】:

用“OR”代替“AND”。

select a.LOB, SUM(a.GPW) AS XGPW,SUM(b.GPW) AS YGPW,SUM(a.GPW) - SUM(b.GPW)     AS GPW_DIFF 
FROM SDSS.DSS_SALES_PRODUCTION_DTLS a,

SDSS.DSS_SALES_PRODUCTION_DTLS b 
where a.LOB = b.LOB and
(a.account_year=2014 or b.account_year=2015)
GROUP BY a.LOB

【讨论】:

    【解决方案3】:

    您需要像这样更改您的and 条件:

    a.account_year in(2014,2015)
    

    所以它会像

    select a.LOB, SUM(a.GPW) AS XGPW,SUM(b.GPW) AS YGPW,SUM(a.GPW) - SUM(b.GPW)     AS GPW_DIFF 
    FROM SDSS.DSS_SALES_PRODUCTION_DTLS a,
    
    SDSS.DSS_SALES_PRODUCTION_DTLS b 
    where a.LOB = b.LOB and
    a.account_year in(2014,2015)
    GROUP BY a.LOB
    

    编辑:

    SELECT LOB, XGPW, YGPW, (XGPW - YGPW) AS GPW_DIFF 
    from 
     (
       select LOB, 
        SUM(CASE WHEN account_year=2014 THEN GPW ELSE 0 END) AS XGPW,
        SUM(CASE WHEN account_year=2015 THEN GPW ELSE 0 END) AS YGPW,
       FROM SDSS.DSS_SALES_PRODUCTION_DTLS
       where account_year in (2014, 2015)
       GROUP BY LOB
     ) x
    

    【讨论】:

    • 还是错了。我需要在不同的列中分别计算 2014 年和 2015 年的 GPW 的总和,而不是两者的总和
    • @MohitaGakhar:- 更新了我的答案。请立即检查!
    • @Rahul Tripathi:现在和我的答案一样 :-)
    • @MohitaGakhar:- 附带说明,请不要使用逗号分隔的连接,因为不推荐使用它们。请改用正确的 JOINS。例如:FROM SDSS.DSS_SALES_PRODUCTION_DTLS a INNER JOIN SDSS.DSS_SALES_PRODUCTION_DTLS b ON a.LOB = b.LOB and
    • @dnoeth:- 是的,我明白了。你的理解比我快。我等待 OP 回复这花了我的时间;)
    猜你喜欢
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2017-04-17
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多