【发布时间】:2022-06-21 16:18:33
【问题描述】:
我正在尝试解决 SQL 在线挑战
我有三张桌子:
- 销售:customer_id、order_date、product_id。
- 成员:join_date、member_id。
- 菜单:product_id、product_name、价格。
其中一个问题是:每个会员在成为会员之前的总物品和花费是多少?
我认为我在以下查询中得到了正确的答案:
with cte as
(
SELECT
CASE WHEN s.customer_id = 'A' THEN count(s.product_id)*m.price END AS purchases_A,
CASE WHEN s.customer_id = 'B' THEN count(s.product_id)*m.price END AS purchases_B,
CASE WHEN s.customer_id = 'C' THEN count(s.product_id)*m.price END AS purchases_C,
case when s.customer_id = 'A' THEN count(s.product_id) END AS total_A,
case when s.customer_id = 'B' THEN count(s.product_id) END AS total_B,
case when s.customer_id = 'C' THEN count(s.product_id) END AS total_C
from sales s
join menu m on s.product_id = m.product_id
join members mb on mb.customer_id = s.customer_id and mb.join_date > s.order_date
group by s.customer_id, m.price
)
select
sum(purchases_A) as total_spendings_a,
sum (total_A) as total_items_A,
sum(purchases_B) as total_spendings_b,
sum (total_B) as total_items_B,
sum(purchases_C) as total_spendings_c,
sum (total_C) as total_items_C
from cte;
我的问题是。编写此查询是否有更好的方法或更有效的方法?感觉太长太重复了。 在这种情况下,我只有三个客户:A、B 和 C 如果我有 100 或 1000 个客户怎么办?
【问题讨论】:
-
任务描述中没有提到这应该仅限于客户 A、B 和 C。您有理由在查询中添加此限制吗?为什么你的
GROUP BY子句中有价格?为什么你想要一个中间结果,每个客户和价格只有一行?我看不出有任何理由。最后,您使用了列members.customer_id,它不在您的表描述中。有两个 ID(会员和客户)还是只有一个?顺便说一句,Menu是一个产品表的有趣名称。
标签: sql postgresql case