我有一个销售表,其中包含 id、order_number、product_number 等列,其他列
id | 订单号 | 产品编号 |
---|---|---|
1 | 300 | 10 |
2 | 300 | 10 |
3 | 300 | 11 |
4 | 301 | 12 |
5 | 301 | 13 |
6 | 302 | 10 |
7 | 303 | 11 |
8 | 304 | 10 |
9 | 304 | 10 |
10 | 305 | 13 |
11 | 305 | 15 |
12 | 305 | 17 |
如何编写查询以返回包含超过 1 个不同 product_number 的所有订单?结果将是 order_nos 300、301 和 305
更进一步,想象一个看起来像这样的产品表
产品编号 | 类别 |
---|---|
10 | 1 |
11 | 2 |
12 | 4 |
13 | 3 |
14 | 5 |
15 | 3 |
16 | 6 |
17 | 3 |
我想找到所有具有超过 1 个不同产品类别的订单,在这种情况下,我只想找到订单 300 和 301,因为 305 的订单都来自类别 3。 最后一步,我如何计算这些订单而不是仅仅列出它们并将这个数字与所有订单进行比较?我希望能够看到有 2 个订单有 2 个不同的类别和总共 5 个订单。
提前致谢!
我尝试使用一个简单的选择查询,加入产品编号的表并使用 HAVING count(distinct product_number) > 1,但如果我将其更改为 < 2 I get no results and if I remove this my results are the same, so clearly something has gone wrong!
最后一步,我如何计算这些订单而不是仅仅列出它们并将这个数字与所有订单进行比较?我希望能够看到有 2 个订单有 2 个不同的类别和总共 5 个订单。
您可以使用两个级别的聚合:
select count(*) cnt_total_orders,
sum(case when cnt_product_numbers > 1 then 1 else 0 end) as cnt_multi_product_orders
from (
select count(distinct product_number) cnt_product_numbers
from mytable
group by order_no
) t
这会产生一个由一行和两列组成的结果集,第一列显示订单总数,第二列仅计算具有多个不同产品的订单。
另一方面,如果您想要一个显示有多少订单具有给定数量的不同产品的结果集,我们可以稍微更改外部查询:
select cnt_product_numbers, count(*) cnt_orders
from (
select count(distinct product_number) cnt_product_numbers
from mytable
group by order_no
) t
group by cnt_product_numbers
使用
count(distinct)
的思路是对的,展开一下:
select order_no
from orders
join products on orders.product_number = products.product_number
group by order_no
having count(distinct category) > 1
以上可用于子查询:
select (
select count(*)
from (
select order_no
from orders
join products on orders.product_number = products.product_number
group by order_no
having count(distinct category) > 1
) x
) as orders_with_multiple_categories, (
select count(distinct order_no)
from orders
) as total_orders