2015-02-10 54 views
0

我想从一个链接到另一个表的总和价格。SQL - SUM不同行

我尝试此查询:

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 

这不是一件好事,因为它概括所有deuplicated因为左行加入。 如果我尝试用“独特”:

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函数是不会来概括所有的价格,只是唯一的价格。

如何根据不同的栏目总结所有价格?

非常感谢


如果我试图让行和SUM Excel的所有行,我有:

count  sum 
58  58492.503 
+2

(1)选择对问题的正确的数据库标签。 (2)添加样品数据以及所需的结果。 – 2015-02-10 14:06:17

+0

并注意,只要您在WHERE子句中具有该g_piece条件,则LEFT JOIN g_piece就像内连接一样工作。 (移动到ON子句,如果你想要一个外连接。) – jarlh 2015-02-10 14:07:33

+0

谢谢,我改变了查询,相同的结果 – Ludo 2015-02-10 14:19:35

回答

0

我看到两个问题:

  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' 
+0

感谢您的帮助,我试过这个,但我认为这是太长的计算,所以数据库不回答:/ – Ludo 2015-02-10 14:36:41

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

谢谢你,我改变了查询,相同的结果 – Ludo 2015-02-10 14:20:43

0

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

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