CASE001-有条件聚合

110 阅读1分钟

1. 数据准备

-- 创建 MySQL 表
CREATE TABLE cook.shop (
  sid INT COMMENT '卖家ID',
  platform VARCHAR(20) COMMENT '电商平台',
  shop_name VARCHAR(20) COMMENT '店铺名称'
);

INSERT INTO cook.shop VALUES 
  (1, '京东', '京东1号店'),
  (1, '淘宝', '淘宝1号店'),
  (1, '淘宝', '淘宝2号店'),
  (2, '京东', '京东1号店'),
  (2, '京东', ''),
  (2, '拼多多', '拼多多1号店'),
  (3, '淘宝', '淘宝1号店'),
  (3, '', '京东1号店'),
  (3, '拼多多', '拼多多1号店'),
  (4, '淘宝', '淘宝1号店'),
  (4, '京东', '京东1号店'),
  (4, '京东', '京东2号店'),
  (4, '拼多多', '拼多多1号店'),
  (4, '拼多多', '拼多多2号店'),
  (5, '京东', '京东1号店'),
  (5, '京东', '京东1号店');

2. 需求

统计每个卖家ID在每个电商平台的店铺数量,要求:

  • 过滤掉 platform = '' 的脏数据
  • 店铺名称为''的不计入店铺数量
  • 在某电商平台下没有店铺的,应该输出0
  • 店铺名称去重后统计

期望结果:

卖家ID淘宝店铺数京东店铺数拼多多店铺数
1210
2011
3101
4122
5010

3. SQL实现

-- 方法一
SELECT 
  sid AS '卖家账号',
  COUNT(DISTINCT CASE WHEN platform = '淘宝' THEN shop_name END) AS '淘宝店铺数', 
  COUNT(DISTINCT CASE WHEN platform = '京东' THEN shop_name END) AS '京东店铺数',
  COUNT(DISTINCT CASE WHEN platform = '拼多多' THEN shop_name END) AS '拼多多店铺数'
FROM cook.shop 
WHERE platform != '' AND shop_name != '' 
GROUP BY sid;

-- 方法二
SELECT 
  tmp.sid AS '卖家账号', 
  SUM(tmp.tb_shop_num) AS '淘宝店铺数', 
  SUM(tmp.jd_shop_num) AS '淘宝店铺数', 
  SUM(tmp.pdd_shop_num) AS '淘宝店铺数' 
FROM (
  SELECT 
    sid, 
    IF(platform = '淘宝', COUNT(DISTINCT shop_name), 0) AS tb_shop_num,
    IF(platform = '京东', COUNT(DISTINCT shop_name), 0) AS jd_shop_num,
    IF(platform = '拼多多', COUNT(DISTINCT shop_name), 0) AS pdd_shop_num
  FROM cook.shop 
  WHERE platform != '' AND shop_name != ''
  GROUP BY sid, platform) AS tmp
GROUP BY sid;