来自内连接的Sum列

时间:2014-08-14 13:20:06

标签: sql sql-server

如何从内连接中对列进行求和?

我已经做到这一点,但结果不正确,例如。

SELECT DISTINCT it.CODE, pl.UNITS
FROM ITEMDETAILS it inner join plant pl ON it.CODE = pl.CODE 
WHERE it.LOCNUMBER = '3434';

这给我这个正确的结果

CODE    UNITS
GE-ARH  2
GE-ARV  2
GE-EC   0.5
GE-JB   0.5
GE-JT   0.5
GE-VL2  2
GE-VL4  2

然后我想将所有UNITS加总为TOTAL,但是当我执行下面的查询时,它给出了错误的计算结果?任何人都可以向我展示我的方式错误吗?

SELECT DISTINCT SUM(pl.UNITS) as TotalUnits 
FROM PLANT pl inner join ITEMDETAILS it on pl.CODE = it.CODE
WHERE it.LOCNUMBER = '3434';

TotalUnits
972

答案显然应该是9.5,我认为它是针对整个列进行计算而不考虑where子句,但不确定为什么?

感谢您一如既往的帮助。

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

select sum(units) 
from
(
  SELECT DISTINCT it.CODE, pl.UNITS
  FROM ITEMDETAILS it inner join plant pl ON it.CODE = pl.CODE 
  WHERE it.LOCNUMBER = '3434'
) un

或者取决于sql版本

;with un as (
  SELECT DISTINCT it.CODE, pl.UNITS
  FROM ITEMDETAILS it inner join plant pl ON it.CODE = pl.CODE 
  WHERE it.LOCNUMBER = '3434'
)
select sum(units)
from un

答案 1 :(得分:1)

我会这样做

SELECT SUM(UNITS) AS TOTAL_UNITS
FROM
(
    SELECT DISTINCT it.CODE, pl.UNITS
    FROM ITEMDETAILS it inner join plant pl ON it.CODE = pl.CODE 
    WHERE it.LOCNUMBER = '3434'
) X

答案 2 :(得分:0)

加入"详细信息表"另一个是促进where where条件"在哪里.LOCNUMBER =' 3434'"。把它带走,加入是没有目的的。

可能是这种连接是不必要的重复的唯一原因(又名"重复")因此可以遵循不同的方法。 e.g。

SELECT
      pl.CODE
    , pl.UNITS
FROM plant pl
WHERE pl.CODE IN (
            SELECT
                  it.CODE
            FROM ITEMDETAILS it
            WHERE it.LOCNUMBER = '3434'
      )
;

SELECT
      SUM(pl.UNITS)
FROM plant pl
WHERE pl.CODE IN (
            SELECT
                  it.CODE
            FROM ITEMDETAILS it
            WHERE it.LOCNUMBER = '3434'
      )
;

可以在子查询中使用带有相关性的EXISTS()代替IN()。


请注意,如果dbms支持sum()over(),则可以将总数作为列生成。