mysql SQL在NOT NULL时移动数据

pnwntuvh  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(135)

这是我在这里的第一个问题,所以请耐心听我说,这是我在处理产品数据时遇到的一个挑战。
| 栏_A|栏_B| C列|栏_D|栏_E|栏_F|
| - -|- -|- -|- -|- -|- -|
| A1级|空值|C1级|第一天|空值|F1代|
| 空值|空值|C2级|空值|E2类|二层|
| A3页|地下三层|空值|第三日|空值|三层|
| 空值|空值|空值|空值|空值|四层|
我所要做的就是把数据格式化成这样一种格式,使前端开发人员可以方便地把它放到网站上。基本上,只要有NULL,我就必须把数据移到其他列中。例如:
1.如果第一、第二、第五列为空,则第三、第四、第六列的数据应分别打印在前三列
1.如果前5列全部为空,则第6列的数据应打印在第1列中,依此类推
预期输出:
| 栏_A|栏_B| C列|栏_D|栏_E|栏_F|
| - -|- -|- -|- -|- -|- -|
| A1级|C1级|第一天|F1代|空值|空值|
| C2级|E2类|二层|空值|空值|空值|
| A3页|地下三层|第三日|三层|空值|空值|
| 四层|空值|空值|空值|空值|空值|
这在SQL中是可能的,如果是的话,请帮助我的方法。
我应该使用case语句还是有更好的方法?

osh3o9ms

osh3o9ms1#

您可以尝试:

  • 取消透视数据并保持每列的顺序,即Column_A顺序为1,Column_B顺序为2,依此类推。
  • 使用ROW_NUMBER()函数对列值不为空的非透视数据进行处理,以获得不包含空值的新顺序。
  • 使用上一步中定义的行号对数据进行条件聚合透视以获得所需的输出。
with t as
(
  select id, Column_A as col, 1 as ord from table_name
  union all
  select id, Column_b, 2 from table_name
  union all
  select id, Column_c, 3 from table_name
  union all
  select id, Column_d, 4 from table_name
  union all
  select id, Column_e, 5 from table_name
  union all
  select id, Column_f, 6 from table_name
),
t2 as
(
  select *, 
    row_number() over (partition by id order by ord) rn
  from t where col is not null
)

select id,
       max(case when rn =1 then col end) Column_A,
       max(case when rn =2 then col end) Column_B,
       max(case when rn =3 then col end) Column_C,
       max(case when rn =4 then col end) Column_D,
       max(case when rn =5 then col end) Column_E,
       max(case when rn =6 then col end) Column_F
from t2 
group by id
order by id

请参见demo

相关问题