【问题标题】:SQL - SUM different rowsSQL - 对不同的行求和
【发布时间】:2015-04-10 14:26:53
【问题描述】:

我想对链接到另一个表的价格求和。

我试试这个查询:

SELECT COUNT(cmd.mt14),
SUM(cmd.mt14)
FROM g_piece cmd
INNER JOIN g_piece lot
ON lot.GPIREFNOTAIRE = cmd.refpiece
AND lot.gpirole    = 'B2029005'

结果是:

count(cmd.mt14)    sum(cmd.mt14)
       100           170704,188

这不好,因为它会因左连接而对所有去重行求和。 如果我尝试使用“独特”:

SELECT count(unique cmd.mt14), 
sum(unique cmd.mt14)
FROM g_piece cmd
INNER JOIN g_piece lot
ON lot.GPIREFNOTAIRE = cmd.refpiece
AND lot.gpirole = 'B2029005'

结果:

count(unique cmd.mt14)    sum(unique cmd.mt14)
       54                       57724,554

问题是这也是错误的,因为 sum 函数不会对所有价格求和,而只是对唯一价格求和。

如何根据不同的列汇总所有价格?

非常感谢


如果我尝试在 excel 上获取行并对所有行求和,我有:

count     sum
58        58492.503

【问题讨论】:

  • (1) 为问题选择正确的数据库标签。 (2) 添加样本数据以及想要的结果。
  • 请注意,只要您在 WHERE 子句中具有 g_piece 条件,LEFT JOIN g_piece 就表现为内连接。 (如果需要外连接,请移至 ON 子句。)
  • 谢谢,我更改了查询,结果相同

标签: sql oracle join sum


【解决方案1】:

必须始终满足您的第二个“LEFT JOIN”,因为您在 WHERE 子句中使用了它的列之一。而且您根本没有使用 IND 表。那么为什么不只是:

SELECT count(cmd.mt14), 
sum(cmd.mt14)
FROM g_piece cmd
INNER JOIN g_piece lot
ON lot.GPIREFNOTAIRE = cmd.refpiece
WHERE lot.gpirole = 'B2029005'

如果这不是您要查找的内容,那么您可能只是想验证您的 CMD 是否存在于特定批次:

SELECT count(cmd.mt14), 
sum(cmd.mt14)
FROM g_piece cmd
WHERE EXISTS (select 1 from g_piece lot
              where lot.GPIREFNOTAIRE = cmd.refpiece
              AND   lot.gpirole = 'B2029005')

【讨论】:

  • 谢谢,我更改了查询,结果相同
【解决方案2】:

我看到两个问题:

  1. 您的 where 子句使您的左连接成为内部连接,因此将限制移动到连接,或将左连接更改为内部连接。
  2. 聚合数据时,如果您不希望包含重复项,则必须在连接发生之前获取总和,从而包含子查询。

SELECT count_mt14, sum_mt14
FROM (SELECT count(cmd.mt14) count_mt14, sum(mt14) sum_mt14, Liebelle_20_1 
      FROM g_Piece group by liebelle_20_1) cmd
LEFT JOIN g_individu ind
   ON ind.refindividu = cmd.LIBELLE_20_1
LEFT JOIN g_piece lot
   ON lot.GPIREFNOTAIRE = cmd.refpiece
  AND lot.gpirole = 'B2029005'

【讨论】:

  • 感谢您的帮助,我试过了,但我认为计算时间太长,所以数据库没有回答:/
【解决方案3】:

非常感谢您的帮助,最后我完成了这个查询:

SELECT SUM(comm.mt14),
  COUNT(comm.refpiece)
FROM
  (
  SELECT UNIQUE cmd.refpiece,
    cmd.mt14
  FROM g_piece cmd
  INNER JOIN g_piece lot
  ON lot.GPIREFNOTAIRE = cmd.refpiece
  WHERE lot.gpirole    = 'B2029005'
  ) comm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多