简体   繁体   中英

Select / group by multiple columns but count just the values of one column

I have 2 tables.

Table #1: orders

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    

The table orders has 3 important criteria but doesn't have the criterion_4 . There is another table with the order_positions which contains multiple criterion_4 entries for each order_id .

Table #2: classifications

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

The table classifications contains classifications for:

  • 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

I have a query where I join classifications.class_1 on the table orders to create a list of all orders and their respective 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

I need a GROUP BY at the end since the table classifications contains multiple entries with the combination of crit_1 , crit_2 and crit_3 . But this isn't a problem since the needed classification_1 is always the same for each combination of crit_1, crit_2 and crit_3 .

Now I want to create another query where I count just the number of each classification_1 for the orders. Something like this:

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

But I don't know how without the whole selection of orders.order_id, orders.crit_1 , orders.crit_2 , orders.crit_3 and classifications.class_1

I just want to count the class_1 classifications for the query above.

Any suggestions?


edit

I tried it like suggested by 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

But the results are not correct and I have no idea how to reproduce those numbers.

A few examples:

| 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     |   

When I use my query with group by then I get 654 entries for class_1 = A. When I make my query without group by then I get 2179 entries for class_1 = A. And when I try the query with Count(*) then I get 1024 entries for class_1 = A.

The last one is definitely not correct.

Just use GROUP BY class_1 for your classifications table and add an EXISTS condition to check if there is an order.

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM