繁体   English   中英

SQL CASE语句中如何查询多个case

[英]How to query many cases in SQL CASE statement

我正在尝试解决 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 个客户怎么办?

只需加入表格并按成员聚合:

select
  m.member_id,
  coalesce(count(*), 0) as total_amount,
  coalesce(sum(price), 0) as total_price
from members m
left join sales s on s.customer_id = m.customer_id and s.order_date < m.join_date
left join menu p on p.product_id = s.product_id
group by m.member_id
order by by m.member_id;

您提到members.member_idmembers.customer_id ,所以我都使用了它们。 如果这是您的请求中的拼写错误,那么只需在我的查询中将错误的列名更改为正确的列名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM