2017-10-13 361 views
1

我有2個表。選擇/按多個列分組,但只計算一列的值

表#1:訂單

order_id | crit_1 | crit_2 | crit_3  | other 
01  | A00 | GER | 49er  | x  
02  | A00 | GER | 49er  | x  
03  | A00 | USA | 49er  | x  
04  | C80 | DEN | 66er  | x  
05  | B50 | GER | 99er  | x  

orders有3個重要的標準,但不具備criterion_4。還有另一張表order_positions其中包含多個criterion_4條目爲每個order_id

表2:分類

crit_1 | crit_2 | crit_3 | crit_4 | class_1 | class_2 
A00 | GER | 49er | 4711 | A  | 11 
A00 | GER | 49er | 4712 | A  | 21 
A00 | USA | 49er | 4711 | D  | 12 
A00 | USA | 49er | 4712 | D  | 21 
B50 | GER | 99er | 4801 | B  | 12 
B50 | GER | 99er | 4802 | B  | 12 
B50 | GER | 99er | 4803 | B  | 14 
C80 | DEN | 66er | 4904 | C  | 22 
C80 | DEN | 66er | 4905 | C  | 21 

classifications包含分類爲:

  • orders = class_1 = combination of crit_1, crit_2 & crit_3
  • order_positions = class_2 = combination of crit_1, crit_2, crit_3 & crit_4

我有一個查詢,我就加入classifications.class_1 TA創建所有orders及其各自的classification的列表。

select 
orders.order_id, 
orders.crit_1, 
orders.crit_2, 
orders.crit_3, 
classifications.class_1 

from 
orders 

left join 
classifications 
on 
orders.crit_1=classifications.crit_1 and 
orders.crit_2=classifications.crit_2 and 
orders.crit_3=classifications.crit_3 

where 
orders.others = "..." 

group by 
orders.order_id, 
orders.crit_1, 
orders.crit_2, 
orders.crit_3, 
classifications.class_1 

我需要一個GROUP BY末以來,表的分類包含的crit_1crit_2crit_3組合多個條目。但是這不是問題,因爲對於crit_1, crit_2crit_3的每個組合,所需的classification_1總是相同的。

現在我想創建另一個查詢,我只計算訂單的每個classification_1的編號。事情是這樣的:

class_1 | number 
A  | 12 
B  | 5 
C  | 18 
.  | . 

但我不知道怎麼沒有orders.order_id,orders.crit_1orders.crit_2orders.crit_3classifications.class_1

我只想算class_1分類爲上述查詢的全選擇。

有什麼建議嗎?


編輯

我試了一下好像建議通過考希克納亞克:

select 
--orders.order_id, 
--orders.crit_1, 
--orders.crit_2, 
--orders.crit_3, 
classifications.class_1, 
count(*) 

from 
orders 

left join 
classifications 
on 
orders.crit_1=classifications.crit_1 and 
orders.crit_2=classifications.crit_2 and 
orders.crit_3=classifications.crit_3 

where 
orders.others = "..." 

group by 
--orders.order_id, 
--orders.crit_1, 
--orders.crit_2, 
--orders.crit_3, 
classifications.class_1 

但結果是不正確的,我不知道如何重現這些數字。

舉幾個例子:

| class_1 | query w/ | query w/o | query | 
|   | group by | group by | count(*) | 
--------------------------------------------- 
| A  | 654  | 2179  | 1024  | 
| B  | 371  | 1940  | 667  | 
| C  | 94  | 238  | 247  | 

當我使用我的查詢與group by然後我得到654項爲class_1 = A. 當我做我的查詢,而無需group by然後我得到2179項爲class_1 = A. 當我嘗試Count(*)查詢,然後我得到了1024條目class_1 =答。

最後一個是絕對不正確的。

+0

簡單'SELECT c.class_1, COUNT(*)FROM級O JOIN分類C對... GROUP BY c.class_1'。它不工作? –

+0

可悲的是它沒有奏效。我上面編輯了我的問題,向您展示我的問題。 – Apo

回答

0

只需使用GROUP BY class_1爲您的classifications表添加EXISTS條件以檢查是否有訂單。

SELECT 
    c.class_1, 
    COUNT(c.class_1) "number" 
FROM 
    classifications c 
WHERE 
    EXISTS (
     SELECT 
      1 
     FROM 
      orders o 
     WHERE 
      o.crit_1 = c.crit_1 
      AND o.crit_2 = c.crit_2 
      AND o.crit_3 = c.crit_3 
    ) 
GROUP BY 
    c.class_1 
ORDER BY 
    1; 
相關問題