SQL:如何连接表,然后通过使用不同条件过滤相同的“日期”字段来创建新列

问题描述 投票:0回答:1

我必须创建一个 SQL 查询,显示过去 90 天内的活动用户、不活动的用户,以及不活动用户的百分比(不活动/所有用户)。我有两个不同的表:订单(order_id、customer_id、order_date、total)和 order_items(order_id、product_id、quantity、unit_price)。

我能够创建第一个字段(活动的和非活动的),但是是分开的。

我尝试合并两个查询,但结果导致条目重复。

此外,仍然不确定如何获得该百分比字段,因为我只能分别处于活动状态和非活动状态。


 SELECT order_items.product_id, COUNT(orders.customer_id) AS active_cust
    FROM orders
    JOIN order_items
    ON orders.order_id = order_items.order_id
    WHERE orders.order_date >= CURRENT_DATE - INTERVAL '90 day'
    GROUP BY order_items.product_id;

SELECT order_items.product_id, COUNT(orders.customer_id) AS inactive_cust
    FROM orders
    JOIN order_items
    ON orders.order_id = order_items.order_id
    WHERE orders.order_date <= CURRENT_DATE - INTERVAL '90 day'
    GROUP BY order_items.product_id;

SELECT * FROM
    (SELECT order_items.product_id, COUNT(orders.customer_id) AS active_cust
    FROM orders
    JOIN order_items
    ON orders.order_id = order_items.order_id
    WHERE orders.order_date >= CURRENT_DATE - INTERVAL '90 day'
    GROUP BY order_items.product_id
    ) AS q1,
    (SELECT COUNT(orders.customer_id) AS inactive_cust
    FROM orders
    JOIN order_items
    ON orders.order_id = order_items.order_id
    WHERE orders.order_date <= CURRENT_DATE - INTERVAL '90 day'
    GROUP BY order_items.product_id
    ) AS q2
    GROUP BY product_id, q1.active_cust, q2.inactive_cust
    ORDER BY product_id;
postgresql multiple-results
1个回答
0
投票

您需要的技巧是过滤聚合,例如:

SELECT order_items.product_id,
       COUNT(orders.customer_id) FILTER (WHERE orders.order_date >= CURRENT_DATE - 90) AS active_cust,
       COUNT(orders.customer_id) FILTER (WHERE orders.order_date < CURRENT_DATE - 90) AS inactive_cust
FROM orders
   JOIN order_items
      ON orders.order_id = order_items.order_id
GROUP BY order_items.product_id;

请注意,由于内部联接,相同的

customer_id
可能会出现多次。如果您只想计算不同的
customer_id
,请使用
COUNT(DISTINCT ...)

© www.soinside.com 2019 - 2024. All rights reserved.