2015-02-10 57 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