在 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;