SQL-在Mysql中将一列拆分为两列

SQL-在Mysql中将一列拆分为两列,mysql,sql,Mysql,Sql,我有这张桌子。考虑到id从0开始 表1 ID Letter 1 A 2 B 3 C 4 D 6 E 我需要以下输出 Col1 Col2 NULL A B C D NULL E NULL 我尝试使用id为、id为-1和id为+1的union,但我不知道如何根据id获取字母,也尝试了奇偶逻辑,但没有任何效果 感谢您的帮助 谢谢您没有发布数据库引擎,因此我假设

我有这张桌子。考虑到id从0开始

表1

ID Letter 1 A 2 B 3 C 4 D 6 E 我需要以下输出

Col1 Col2 NULL A B C D NULL E NULL 我尝试使用id为、id为-1和id为+1的union,但我不知道如何根据id获取字母,也尝试了奇偶逻辑,但没有任何效果

感谢您的帮助


谢谢

您没有发布数据库引擎,因此我假设PostgreSQL的模数操作数为%

查询应为:

select o.letter, e.letter
  from (
    select id, letter, id as base from my_table where id % 2 = 0
  ) o full outer join (
    select id, letter, (id - 1) as base from my_table where id % 2 <> 0
  ) e on e.base = o.base
  order by coalesce(o.base, e.base)
由于我没有在MySQL 5.6中测试它的方法,所以请对以下选项持保留态度。在没有完全外部联接的情况下,可以执行两个外部联接,然后可以合并它们,如中所示:

select * from (
  select o.base, o.letter, e.letter
    from (
      select id, letter, id as base from my_table where id % 2 = 0
    ) o left join (
      select id, letter, (id - 1) as base from my_table where id % 2 <> 0
    ) e on e.base = o.base
  union
  select e.base, o.letter, e.letter
    from (
      select id, letter, id as base from my_table where id % 2 = 0
    ) o right join (
      select id, letter, (id - 1) as base from my_table where id % 2 <> 0
    ) e on e.base = o.base
) x
order by base

只需使用条件聚合:

select max(case when id % 2 = 0 then letter end) as col1,
       max(case when id % 2 = 1 then letter end) as col2
from t
group by floor(id / 2);

如果您愿意,可以使用mod而不是%。MySQL同时支持这两种功能。

能否请您格式化表格,使行和列更清晰?请告诉我们您使用的是哪种DBMS……对不起,我只是在格式化表格而已,这当然可以完成工作,尽管OP中的细节不多。做得好:感谢您以如此少的细节快速回复。逻辑工作正常,但MySQL和完全外部连接不起作用。哪个版本的MySQL?5.x或8.x?MySQL 5.6。此外,我还尝试使用left和right join-then-union,但不知道如何继续,请查看第二个SQL。我希望它能起作用,但它会变得越来越难看。如果我没弄错的话,我会建议编辑一个小错误:floori/2应该是Floorrid/2?我必须说,使用max和group by floorn/2真的很聪明-我以前从未见过这样的用法。你是怎么想到的?你在别的地方见过吗?@dossy。毫无疑问,我也见过类似的问题。这个解决方案对我来说比基于连接的解决方案更为明显。这个问题在我看来像是条件聚合。