Mysql sql语句中的when为NULL

Mysql sql语句中的when为NULL,mysql,sql,Mysql,Sql,我用case-when语句按年龄对人进行分类,所以 select case when age >= 11 and age <= 20 then name end column1 as "11-20", case when age >= 21 and age <= 30 then name end column2 as "21-30", case when age >= 31 and age <= 40 then

我用case-when语句按年龄对人进行分类,所以

select 
        case when age >= 11 and age <= 20 then name end column1 as "11-20",
        case when age >= 21 and age <= 30 then name end column2 as "21-30",
        case when age >= 31 and age <= 40 then name end column3 as "31-40"
from passenger
我希望输出看起来像:

11-20    21-30    31-40
John     Kevin    Beckey
Michael 
那么,我如何删除空值或向上移动非空值呢 我使用的是MySQL,您可以通过执行group by来删除空值。但是,你没有一个小组的钥匙。大多数数据库支持行数功能。使用该功能,您可以执行以下操作:

select max(case when agegroup = '11-20' then name end) as "11-20",
       max(case when agegroup = '21-30' then name end) as "21-30",
       max(case when agegroup = '31-40' then name end) as "31-40"
from (select p.*, row_number() over (partition by agegroup order by name) as seqnum
      from (select p.*,
                   (case when age >= 11 and age <= 20 then '11-20'
                         when age >= 21 and age <= 30 then '21-30'
                         when age >= 31 and age <= 40 then '31-40'
                    end) as agegroup
            from passenger p
           ) p
group by seqnum;
编辑:

MySQL中的等效项使用变量:

select max(case when agegroup = '11-20' then name end) as "11-20",
       max(case when agegroup = '21-30' then name end) as "21-30",
       max(case when agegroup = '31-40' then name end) as "31-40"
from (select p.*,
             @rn := if(agegroup = @agegroup, @rn + 1, 1) as seqnum,
             @agegroup := agegroup
      from (select p.*,
                   (case when age >= 11 and age <= 20 then '11-20'
                         when age >= 21 and age <= 30 then '21-30'
                         when age >= 31 and age <= 40 then '31-40'
                    end) as agegroup
            from passenger p
           ) p cross join
           (select @rn := 0, @agegroup := '') var
       order by agegroup
      ) p
group by seqnum;
通过执行group by来删除空值。但是,你没有一个小组的钥匙。大多数数据库支持行数功能。使用该功能,您可以执行以下操作:

select max(case when agegroup = '11-20' then name end) as "11-20",
       max(case when agegroup = '21-30' then name end) as "21-30",
       max(case when agegroup = '31-40' then name end) as "31-40"
from (select p.*, row_number() over (partition by agegroup order by name) as seqnum
      from (select p.*,
                   (case when age >= 11 and age <= 20 then '11-20'
                         when age >= 21 and age <= 30 then '21-30'
                         when age >= 31 and age <= 40 then '31-40'
                    end) as agegroup
            from passenger p
           ) p
group by seqnum;
编辑:

MySQL中的等效项使用变量:

select max(case when agegroup = '11-20' then name end) as "11-20",
       max(case when agegroup = '21-30' then name end) as "21-30",
       max(case when agegroup = '31-40' then name end) as "31-40"
from (select p.*,
             @rn := if(agegroup = @agegroup, @rn + 1, 1) as seqnum,
             @agegroup := agegroup
      from (select p.*,
                   (case when age >= 11 and age <= 20 then '11-20'
                         when age >= 21 and age <= 30 then '21-30'
                         when age >= 31 and age <= 40 then '31-40'
                    end) as agegroup
            from passenger p
           ) p cross join
           (select @rn := 0, @agegroup := '') var
       order by agegroup
      ) p
group by seqnum;

根据Gordon Lindoff的Oracle答案,您可以在MySQL中这样做:

select
  max(case when agegroup = '11-20' then name end) as "11-20",
  max(case when agegroup = '21-30' then name end) as "21-30",
  max(case when agegroup = '31-40' then name end) as "31-40"
from 
  (select @rownum1 := 0, @rownum2 := 0, @rownum3 := 0) v,
  (select
     case
       when Age > 10 and Age <= 20 then '11-20' 
       when Age > 20 and Age <= 30 then '21-30' 
       when Age > 30 and Age <= 40 then '31-40'
     end as agegroup,
     case
       when Age > 10 and Age <= 20 then @rownum1 := @rownum1 + 1 
       when Age > 20 and Age <= 30 then @rownum2 := @rownum2 + 1 
       when Age > 30 and Age <= 40 then @rownum3 := @rownum3 + 1
     end as seqnum,
     name
   from
     Passengers) p
group by
  seqnum
演示:


使用给定的数据。

根据Gordon Lindoff的Oracle答案,您可以在MySQL中这样做:

select
  max(case when agegroup = '11-20' then name end) as "11-20",
  max(case when agegroup = '21-30' then name end) as "21-30",
  max(case when agegroup = '31-40' then name end) as "31-40"
from 
  (select @rownum1 := 0, @rownum2 := 0, @rownum3 := 0) v,
  (select
     case
       when Age > 10 and Age <= 20 then '11-20' 
       when Age > 20 and Age <= 30 then '21-30' 
       when Age > 30 and Age <= 40 then '31-40'
     end as agegroup,
     case
       when Age > 10 and Age <= 20 then @rownum1 := @rownum1 + 1 
       when Age > 20 and Age <= 30 then @rownum2 := @rownum2 + 1 
       when Age > 30 and Age <= 40 then @rownum3 := @rownum3 + 1
     end as seqnum,
     name
   from
     Passengers) p
group by
  seqnum
演示:



使用给定的数据。

您应该查看数据透视您使用的是什么RDBMS?其中一些具有内置的透视操作,另一些则需要技巧。您应该了解透视您使用的是什么RDBMS?其中一些有内置的透视操作,另一些则需要技巧。我发布并删除了这样的答案,但它不会产生预期的结果。约翰和迈克尔不会同时出现在第一栏。@Barmar你的答案不同。这一个首先生成每个年龄组的数字,然后根据这些行号进行分组。啊,我明白了。我使用MySQL,它没有行号或分区。很抱歉,我没有发布,但我正在使用mysql@GolezTrol . . . 很好地使用SQL小提琴。现在,输入错误@agegroup=agegroup被固定为@agegroup:=agegroup。我发布并删除了这样一个答案,但它不会产生预期的结果。约翰和迈克尔不会同时出现在第一栏。@Barmar你的答案不同。这一个首先生成每个年龄组的数字,然后根据这些行号进行分组。啊,我明白了。我使用MySQL,它没有行号或分区。很抱歉,我没有发布,但我正在使用mysql@GolezTrol . . . 很好地使用SQL小提琴。现在,输入错误@agegroup=agegroup被固定为@agegroup:=agegroup。好吧,我真的不介意,但我自己也加了一把小提琴是的,我看到了。我认为使用OP给出的数据会更容易理解。嗯,我真的不介意,但我自己也加了一把小提琴是的,我看到了。我认为使用OP提供的数据会更容易理解。