SQL - 对不同行求和

SQL - SUM different rows

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

我试试这个查询:

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

这不好,因为它对所有因左连接而去重的行求和。 如果我尝试 "unique" :

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

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

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')

我看到两个问题:

  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'

非常感谢你的帮助,我终于完成了这个查询:

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