在SQL中基于一列聚合行



我有一个看起来像这样的数据集:

total_sales

我们可以使用case根据category_id中的值对列product_id进行格式化,然后根据结果进行分组。

create table myTable(
Report_id int,
Category_id char(1),
Product_id int,
Yearmonth varchar(6),
total_sales int
);
<>以前✓
insert into myTable values
(10   ,'A',   1,  202201  ,10),
(10   ,'A',   1,  202202  ,16),
(10   ,'A',   2,  202201  ,11),
(10   ,'A',   3,  202201  ,8),
(10   ,'A',   4,  202201  ,12),
(10   ,'A',   4,  202202  ,15),
(10   ,'B',   7,  202202  ,19),
(10   ,'B',   8,  202204  ,17),
(10   ,'B',   9,  202203  ,9);
<>以前✓
Select
Report_id,
Category_id,
Case when category_id = 'A' then 'misc'
Else product_id end Product_ID,
Yearmonth,
Sum(total_sales) total_sales
From myTable
Group by 1,2,3,4;
Report_id | Category_id | Product_ID | Yearmonth | total_sales--------: | :---------- | :--------- | :-------- | ----------:10 | A |杂项| 202201 | 4110 | A |杂项| 202202 | 3110 | b | 7 | 202202 | 1910 | b | 8 | 202204 | 1710 | B | 9 | 202203 | 9

db<此处小提琴>

可以聚合:

  • total_sales with SUM函数
  • product_id与GROUP_CONCAT以有条件的方式使用IF函数
SELECT report_id,
category_id,
IF(GROUP_CONCAT(product_id) LIKE '%,%', 
'misc', 
GROUP_CONCAT(product_id))            AS product_id,
year_month_,
SUM(total_sales)                        AS total_sales
FROM tab
GROUP BY report_id,
category_id,
year_month_

点击这里查看演示。

注意:这是一个通用的解决方案,以防您的'misc'值应该在任何类别中找到,而不是根据您的特定样本数据在唯一的类别' a '中找到。

相关内容

  • 没有找到相关文章

最新更新