SQL-在Mysql中将一列拆分为两列
我有这张桌子。考虑到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获取字母,也尝试了奇偶逻辑,但没有任何效果 感谢您的帮助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获取字母,也尝试了奇偶逻辑,但没有任何效果 感谢您的帮助 谢谢您没有发布数据库引擎,因此我假设
谢谢您没有发布数据库引擎,因此我假设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。毫无疑问,我也见过类似的问题。这个解决方案对我来说比基于连接的解决方案更为明显。这个问题在我看来像是条件聚合。