【问题标题】:Sum column from inner join来自内部连接的总和列
【发布时间】:2014-08-14 22:22:39
【问题描述】:

如何对内部联接中的列求和?

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

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 子句,但不知道为什么?

一如既往地感谢您的帮助。

【问题讨论】:

  • 您使用的是什么 RDBMS,以防万一?
  • 您的查询返回 972,因为它没有对您在原始查询中返回的不同值求和。相反,您正在提取不同的总和。下面的 Adrian 或 Dumitrescu Bogdan 解决方案将解决它。
  • 干杯 JChao,杜米特雷斯库给了我正确的答案。感谢收看。
  • 这是正确的答案吗?在您的问题中,您没有提供两个源表的数据,只是一个临时结果。我觉得您可以完全避免 distinct(并且可能应该) - 并且还需要知道使用了哪个 dbms

标签: sql sql-server


【解决方案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

【讨论】:

  • 感谢 Dumitrescu,第一个查询很完美。感谢您的所有帮助。
  • 保重!使用 distinct 可能会给你误导(不正确)的结果我不知道它会 - 但它可以(取决于数据)
【解决方案2】:

我会这样做

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

【讨论】:

  • 感谢您将我指向 distinct 关键字。我错过了。我删除了我的帖子,因为它没有提供任何有用的信息。
【解决方案3】:

将一个“明细表”连接到另一个的目的是为了方便 where 条件“WHERE it.LOCNUMBER = '3434'”。把它拿走,就没有加入的目的了。

可能是这种连接是不想要的重复(也称为“重复”)的唯一原因,因此可以采用不同的方法。例如

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() 那么这可能会产生一个列的整体总数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2021-06-24
    • 2018-12-19
    • 2012-12-09
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多