我有两个表,名称分别为Orders and Products(订单和产品),order表包含一个客户的特定订单数量,该订单中包含的产品位于Products表中。 / p>
我的要求是获取最经常出现的产品的总订单数。 表示这些产品的产品1,产品2,产品3的总订单是多少,如果一个订单包含10个产品,其中产品1,产品2和产品3则该订单应计算在内。
对于order_id,可能会有多种产品,我对如何获得此结果感到困惑。任何人都可以分享或提出解决方案吗?
我正在使用PostgreSQL。
下面是示例查询,
SELECT
"Orders"."order_id",pr.product_name
FROM
"data"."orders" AS "Orders"
LEFT JOIN data.items i On i."order_id"="Orders"."order_id"
LEFT join data.products pr on pr."product_id"=i."product_id"
WHERE TO_CHAR("Orders"."created_at_order",'YYYY-MM-DD') BETWEEN '2019-02-01' AND '2019-04-30'
ORDER BY "Orders"."order_id"
期望的结果将是这样(3列),这是购买最多的产品组合,包含已发生订单的数量。
产品1,产品2,产品3等...,订单数
这是示例数据输出,需要组合购买最多的产品列表。(到目前为止,我仅给出3列示例,但可能会根据订单中的产品数量而有所不同。)< / p>
和示例
答案 0 :(得分:0)
如果您通常希望获得某些产品的订单数量,则只需从产品表中计算按产品分组的订单数量即可。查询应如下所示:
SELECT product_id, COUNT(*)
FROM data.products
GROUP BY product_id
ORDER BY COUNT(*)
LIMIT 1;
希望这会有所帮助!
答案 1 :(得分:0)
尝试使用GROUP BY并按以下方式获取MOST计数值-
SELECT
pr.product_name,
COUNT(DISTINCT Orders.order_id)
FROM
"data"."orders" AS "Orders"
LEFT JOIN data.items i On i."order_id"="Orders"."order_id"
LEFT join data.products pr on pr."product_id"=i."product_id"
WHERE TO_CHAR("Orders"."created_at_order",'YYYY-MM-DD') BETWEEN '2019-02-01' AND '2019-04-30'
GROUP BY pr.product_name
ORDER BY COUNT(DISTINCT Orders.order_id) DESC
LIMIT 1 -- You can use the LIMIT or NOT as per requirement
答案 2 :(得分:0)
SELECT
"Orders"."order_id",
string_agg(DISTINCT pr.product_name,::character varying, ',') AS product_name
count(1) AS product_no
FROM
"data"."orders" AS "Orders"
LEFT JOIN data.items i On i."order_id"="Orders"."order_id"
LEFT join data.products pr on pr."product_id"=i."product_id"
WHERE TO_CHAR("Orders"."created_at_order",'YYYY-MM-DD') BETWEEN '2019-02-01' AND '2019-04-30'
GROUP BY "Orders"."order_id"
ORDER BY count(1);
您可以尝试使用group by子句。