[英]NULL in sql case when statements
我將按年齡將人們按年齡分類,並帶有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 NULL NULL
NULL Kevin NULL
Michael NULL NULL
NULL NULL Beckey
我希望輸出看起來像:
11-20 21-30 31-40
John Kevin Beckey
Michael
所以我該如何刪除NULL或將非NULL值向上移動?
根據戈登·林多夫(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
演示: http : //sqlfiddle.com/#!2/5ea1a/9
擺弄給定的數據。
通過對group by
進行group by
可以刪除NULL
。 但是,您沒有group by
的密鑰。 大多數數據庫都支持row_number()
函數。 使用該功能,您可以執行以下操作:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.