2017-10-13 209 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; 
相关问题