按多列选择/分组,但只计算一列的值

时间:2017-10-13 16:57:19

标签: sql oracle count

我有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加入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

我最后需要一个GROUP BY,因为表格分类包含多个条目,其中包含crit_1crit_2crit_3的组合。但这不是一个问题,因为classification_1crit_1, crit_2的每个组合所需的crit_3始终相同。

现在我想创建另一个查询,其中我只计算订单的每个classification_1的数量。像这样:

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

但如果没有完整的订单选择,我就不知道怎么做。订单,orders.crit_1orders.crit_2orders.crit_3classifications.class_1

我只想计算上述查询的class_1分类。

有什么建议吗?

修改

我试过像Kaushik Nayak建议的那样:

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的查询时,我得到class_1 = A的654个条目。 当我在没有group by的情况下进行查询时,我获得了class_1 = A的2179个条目。 当我使用Count(*)尝试查询时,我会获得class_1 = A

的1024个条目

最后一个绝对不正确。

1 个答案:

答案 0 :(得分:0)

只需对GROUP BY表使用classifications 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;