@R星校长
Table 1
ID | Type | Is_active |
---|---|---|
1 | A | Y |
1 | B | N |
2 | A | Y |
2 | C | Y |
3 | C | Y |
假设表格1
有三列,分别是 商场id
比如 商场1
商场2
商场3
产品类别比如A
B
C
是否在售 : Y
表示 Yes
在售 N
表示No
现在想转化成透视表格,也就是每个商场用一行写清楚
要把同一个商场的所有记录整合成一行,还需要结合使用 GROUP BY
一步步来,先看没有 GROUP BY
的情况
select id,
case when type = 'A' then is_active else null end A_active,
case when type = 'B' then is_active else null end B_active,
case when type = 'C' then is_active else null end C_active
from
table_1
order by id;
Without Aggregate Function
ID | A_active | B_active | C_active |
---|---|---|---|
1 | Y | ||
1 | N | ||
2 | Y | ||
2 | Y | ||
3 | Y |
Pivot table(透视表)
ID | A_active | B_active | C_active |
---|---|---|---|
1 | Y | N | |
2 | Y | Y | |
3 | Y |
select id,
max(case when type = 'A' then is_active else null end) A_active,
max(case when type = 'B' then is_active else null end) B_active,
max(case when type = 'C' then is_active else null end) C_active
from
table_1
group by id
order by id;
其实就是新增了三个列,分别对应ABC
是否在售,这里的操作是每一行它都会进行判断
比如头两行都针对商场一,但第一行只有产品A
的情况,因此在上个CASE WHEN
做判断时,只有对应类别 A
那列有数值,而其他两列都为空,其他各行也是同理,因此只能对,某个商场的某一个(商品)种类进行判断,原表格有多少行,新表格就有多少行,所以要借助分组函数(GROUP BY
)分组函数,把分散的信息整合到一起
用商场ID
进行分组后,再从组内取最大值,此时CASE WHEN
里的判断条件,类别是否等于A
,第一行和第二行的输出结果分别是Y-Yes
和空(NULL)
,而另一列也是同理,N
和空
的最大值也是N
,但由于商场一没有产品类别C
,所以两个空的最大值仍然是空
扫描二维码关注公众号,回复:
12410390 查看本文章

商场二和商场三的信息也同理可推,事实上怎分组,以及用什么样的分组函数都是可以根据需求去调整的,但基本的思路和逻辑框架就是这样了