被2分组时计算场的出现 [英] Count Ocurrence of Field whilst being Group By 2

查看:77
本文介绍了被2分组时计算场的出现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力尝试在item_id行上获取订单ID的计数,非常感谢您的帮助!

I'm struggling to try to have the count of order id on an item_id row, any help is greatly appreciated!


Data
item_id | order_id
1 | Order_1
2 | Order_1
3 | Order_2
4 | Order_3
Desired Result

item_id | order_id | items_in_order
1 | Order_1 | 2
2 | Order_1 | 2
3 | Order_2 | 1
4 | Order_3 | 1


   SELECT S.item_id, S.`order_id`, S.order_total, C.cnt as items_in_order,

       `order_discount` / C.cnt as item_discount,
                `order_total` / C.cnt  as item_price
FROM `orders` S 
LEFT JOIN (SELECT `item_id`, `order_id`, count(`order_id`) as cnt  FROM `supplier_orders` GROUP BY `order_id`) 
C ON S.`order_id` = C.`order_id` AND S.id = C.item_id

This would produce this with null values
item_id | order_id | items_in_order | item_discount | item_price
3009117 | 3029511 | 2    | 0    | 25 
3009118 | 3029511 | null | null | null 

更新,现在似乎可以正常使用

UPDATE, this now seems to work as intended


SELECT S.`item_id`, S.`order_id`, S.order_total, C.cnt as items_in_order,

       `order_discount` / C.cnt as item_discount,
                `order_total` / C.cnt  as item_price
FROM `orders` S 
INNER JOIN (SELECT `item_id`, `order_id`, count(`order_id`) as cnt  FROM `orders` GROUP BY `order_id`) 
C ON S.`order_id` = C.`order_id` 
GROUP BY S.`item_id`


推荐答案

您的查询与您的样本数据无关;但是您似乎想要聚合和排名。在MySQL 8.0中,您可以这样做:

Your query does not relate to your sample data; however you seem to want aggregation and ranking. In MySQL 8.0, you would do:

select
    row_number() over(order by count(*) desc) rn,
    order_id,
    count(*) items_in_order
from data
group by order_id
order by rn

我将第一列命名为 rn (对于 rank ):我发现 id 在这里令人困惑,因为您已经在表中有一列具有该名称的列。

I named the first column rn (for rank): I find id confusing here, since you already have a column with that name in the table.

在早期版本中,一个选项使用会话变量而不是 row_number()

In earlier versions, one option uses a session variable instead of row_number():

select @rn := @rn + 1 rn, order_id, items_in_order
from (
    select order_id, count(*) items_in_order
    from data
    group by order_id
    order by items_in_order desc
) t
cross join (select @rn := 0) r
order by items_in_order desc

这篇关于被2分组时计算场的出现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆