在 SQL 中 pivot/stack table 的方法
A way to pivot/stack table in SQL
我有一个table像这个
garden_1 garden_2 garden_3
apple grape lime
orange apple kiwi
lime kiwi orange
对于整个 table 中的每个唯一元素,我需要包含所有这些唯一值的另一列。
如果该值出现在列中,它应该 return 1,否则它应该 return 0。
所以预期的输出应该是:
fruit garden_1 garden_2 garden_3
apple 1 1 0
orange 1 0 1
lime 1 0 1
grape 0 1 0
kiwi 0 1 1
在 Python 中,我使用以下方法使其工作:
gardens_new.loc[:, :] = gardens.stack().reset_index().pivot_table(index=0, columns="level_1", aggfunc="count").notna().astype(int).droplevel(0, axis=1)
关于如何在 SQL 中执行相同操作的任何想法?
下面 SQL 给出了如何实现您想要的结果的想法:
select 'apple' fruit, sum(case garden_1 when 'apple' then 1 else 0 end) garden_1, sum(case garden_2 when 'apple' then 1 else 0 end) garden_2, sum(case garden_3 when 'apple' then 1 else 0 end) garden_3 from tmp_1 union select 'grape' fruit, sum(case garden_1 when 'grape' then 1 else 0 end) garden_1, sum(case garden_2 when 'grape' then 1 else 0 end) garden_2, sum(case garden_3 when 'grape' then 1 else 0 end) garden_3 from tmp_1 union select 'kiwi' fruit, sum(case garden_1 when 'kiwi' then 1 else 0 end) garden_1, sum(case garden_2 when 'kiwi' then 1 else 0 end) garden_2, sum(case garden_3 when 'kiwi' then 1 else 0 end) garden_3 from tmp_1;
您可以根据需要更改此 SQL。 Decode() 也可以用来代替 case 语句。
您可以逆透视和聚合。对于反透视,最通用的方法是 union all
:
select fruit,
sum(garden_1) as garden_1,
sum(garden_2) as garden_2,
sum(garden_3) as garden_3
from ((select garden_1 as fruit, 1 as garden_1, 0 as garden_2, 0 as garden_3
from t
) union all
(select garden_2, 0 as garden_1, 1 as garden_2, 0 as garden_3
from t
) union all
(select garden_3, 0 as garden_1, 0 as garden_2, 1 as garden_3
from t
)
) g
group by fruit;
我有一个table像这个
garden_1 garden_2 garden_3
apple grape lime
orange apple kiwi
lime kiwi orange
对于整个 table 中的每个唯一元素,我需要包含所有这些唯一值的另一列。
如果该值出现在列中,它应该 return 1,否则它应该 return 0。
所以预期的输出应该是:
fruit garden_1 garden_2 garden_3
apple 1 1 0
orange 1 0 1
lime 1 0 1
grape 0 1 0
kiwi 0 1 1
在 Python 中,我使用以下方法使其工作:
gardens_new.loc[:, :] = gardens.stack().reset_index().pivot_table(index=0, columns="level_1", aggfunc="count").notna().astype(int).droplevel(0, axis=1)
关于如何在 SQL 中执行相同操作的任何想法?
下面 SQL 给出了如何实现您想要的结果的想法:
select 'apple' fruit, sum(case garden_1 when 'apple' then 1 else 0 end) garden_1, sum(case garden_2 when 'apple' then 1 else 0 end) garden_2, sum(case garden_3 when 'apple' then 1 else 0 end) garden_3 from tmp_1 union select 'grape' fruit, sum(case garden_1 when 'grape' then 1 else 0 end) garden_1, sum(case garden_2 when 'grape' then 1 else 0 end) garden_2, sum(case garden_3 when 'grape' then 1 else 0 end) garden_3 from tmp_1 union select 'kiwi' fruit, sum(case garden_1 when 'kiwi' then 1 else 0 end) garden_1, sum(case garden_2 when 'kiwi' then 1 else 0 end) garden_2, sum(case garden_3 when 'kiwi' then 1 else 0 end) garden_3 from tmp_1;
您可以根据需要更改此 SQL。 Decode() 也可以用来代替 case 语句。
您可以逆透视和聚合。对于反透视,最通用的方法是 union all
:
select fruit,
sum(garden_1) as garden_1,
sum(garden_2) as garden_2,
sum(garden_3) as garden_3
from ((select garden_1 as fruit, 1 as garden_1, 0 as garden_2, 0 as garden_3
from t
) union all
(select garden_2, 0 as garden_1, 1 as garden_2, 0 as garden_3
from t
) union all
(select garden_3, 0 as garden_1, 0 as garden_2, 1 as garden_3
from t
)
) g
group by fruit;