2017-10-13 14 views
1

2つのテーブルがあります。複数の列で選択/グループ化しますが、1つの列の値を数えます

表#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のテーブルがあり、order_idごとに複数のcriterion_4エントリが含まれています。

表#2:私は上classifications.class_1に参加するクエリを持って

  • 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

:分類

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を入力して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 

テーブル分類がcrit_1crit_2crit_3の組み合わせで複数のエントリを含んでいるので、私は終わりにGROUP BYを必要とします。しかし、これは問題ではない。なぜなら、必要とされるclassification_1は、crit_1, crit_2crit_3の各組み合わせに対して常に同じであるからである。

ここでは、注文ごとにそれぞれclassification_1の数を数える別のクエリを作成します。このような何か:

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

しかし、私は知らないどのようにorders.order_id、orders.crit_1orders.crit_2orders.crit_3と私は上記のクエリのためのclass_1分類をカウントするclassifications.class_1

の全部選択なし。

提案がありますか?


編集

Kaushikによるナーヤカによって提案されたように私はそれを試してみました:

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と私のクエリを使用すると、私はgroup byせずに私のクエリを作るとき、私は= A. class_1のための654のエントリを取得し、その後、私はclass_1 = Aの2179個のエントリを取得します Count(*)でクエリを実行すると、class_1 = Aの1024エントリが得られます。

最後の1つは間違いです。

+0

簡単 'SELECT c.class_1、 COUNT(*) O注文FROMは、分類がGROUP BY c.class_1' ...上のC JOIN。それは働いていないのですか? –

+0

悲しいことに、うまくいきませんでした。私はあなたに私の問題を示すために私の質問を編集しました。 – Apo

答えて

0

classificationsテーブルにはGROUP BY class_1を使用し、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; 
関連する問題