2013-12-18 32 views
0

我有一個MySQL表:在MySQL中如何使用case語句重寫查詢?

create table tbl (
    amount int 
); 

insert into tbl (amount) values (1); 
insert into tbl (amount) values (2); 
insert into tbl (amount) values (3); 
insert into tbl (amount) values (4); 

我的目標是多少值都在下面的水桶,使用情況statment報告。

桶答:值0-1
桶B:值2-5
鬥C:值6-9

首先讓我們嘗試一個簡單的查詢:

select "Bucket A" as Bucket, count(amount) "Count" 
from tbl 
where amount in (0,1) 
union 
select "Bucket B" as Bucket, count(amount) "Count" 
from tbl 
where amount in (2,3,4,5) 
union 
select "Bucket C" as Bucket, count(amount) "Count" 
from tbl 
where amount in (6,7,8,9); 

結果:

+----------+-------+ 
| Bucket | Count | 
+----------+-------+ 
| Bucket A |  1 | 
| Bucket B |  3 | 
| Bucket C |  0 | 
+----------+-------+ 

結果是完美的,但我想要一個案例聲明。
所以我試試這個:

select 
sum(case when amount in (0,1) then 1 else 0 end) as "Bucket A", 
sum(case when amount in (2,3,4,5) then 1 else 0 end) as "Bucket B", 
sum(case when amount in (6,7,8,9) then 1 else 0 end) as "Bucket C" 
from tbl; 

結果:

+----------+----------+----------+ 
| Bucket A | Bucket B | Bucket C | 
+----------+----------+----------+ 
|  1 |  3 |  0 | 
+----------+----------+----------+ 

值是正確的,和偉大的,我有一個case語句,但問題是價值觀得到了轉動。

我該如何才能
1.使用案例陳述
2.沒有支點?

+0

有什麼方法來確定其編程鬥具有'amount',或者你只是去與這些價值觀? –

+0

我想我需要用我在問題中提供的值。 – davidjhp

回答

1

你可以做到這一點使用聚合:

select (case when amount in (0, 1) then 'Bucket A' 
      when amount in (2, 3,4, 5) then 'Bucket B' 
      when amount in (6, 7, 8, 9) then 'Bucket C' 
     end) as bucket, count(*) as `count` 
from tbl 
where amount in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 
group by (case when amount in (0, 1) then 'Bucket A' 
       when amount in (2,3,4,5) then 'Bucket B' 
       when amount in (6,7,8,9) then 'Bucket C' 
      end); 

編輯:

數碼克里斯使一個很好的點。這可以通過使用left outer join來解決:

select (case when tbl.amount in (0, 1) then 'Bucket A' 
      when tbl.amount in (2, 3,4, 5) then 'Bucket B' 
      when tbl.amount in (6, 7, 8, 9) then 'Bucket C' 
     end) as bucket, count(tbl.amount) as `count` 
from (select 0 as amount union all 
     select 2 as amount union all 
     select 6 as amount 
    ) throwaway left outer join 
    tbl 
    on throwaway.amount = tbl.amount 
where tbl.amount in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 
group by (case when tbl.amount in (0, 1) then 'Bucket A' 
       when tbl.amount in (2,3,4,5) then 'Bucket B' 
       when tbl.amount in (6,7,8,9) then 'Bucket C' 
      end); 

或者,也許更清晰,使用原始查詢作爲子查詢:

select buckets.bucket, coalesce(`count`, 0) as `count` 
from (select 'Bucket A' as bucket union all 
     select 'Bucket B' union all 
     select 'Bucket C' 
    ) buckets left outer join 
    (select (case when amount in (0, 1) then 'Bucket A' 
        when amount in (2, 3,4, 5) then 'Bucket B' 
        when amount in (6, 7, 8, 9) then 'Bucket C' 
       end) as bucket, count(*) as `count` 
     from tbl 
     where amount in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 
     group by (case when amount in (0, 1) then 'Bucket A' 
        when amount in (2,3,4,5) then 'Bucket B' 
        when amount in (6,7,8,9) then 'Bucket C' 
       end) 
    ) g 
    on buckets.bucket = g.bucket; 
+0

這不會給你一個「桶C,0」 –

+0

@DigitalChris的記錄。 。 。好點子。不過,解決問題的確會使查詢更復雜一些。 –

0
select 
"Bucket A" as "Bucket", sum(case when amount in (0,1) then 1 else 0 end) as "Count" from tbl 
UNION 
select "Bucket B", sum(case when amount in (2,3,4,5) then 1 else 0 end) from tbl 
UNION 
select "Bucket C", sum(case when amount in (6,7,8,9) then 1 else 0 end) from tbl; 

喜歡這個? sqlfiddle

0
SELECT "Bucket A" AS Bucket , 
(SELECT SUM(CASE WHEN amount IN (0,1) THEN 1 ELSE 0 END) FROM tbl) AS "COUNT" 
UNION 
SELECT "Bucket B" AS Bucket , 
(SELECT SUM(CASE WHEN amount IN (2,3,4,5) THEN 1 ELSE 0 END) FROM tbl) AS "COUNT" 
UNION 
SELECT "Bucket C" AS Bucket , 
(SELECT SUM(CASE WHEN amount IN (6,7,8,9) THEN 1 ELSE 0 END) FROM tbl) AS "COUNT" 

sqlfiddle demo

0

使用中的羣組名稱的製造列表,然後左連接表:

select concat('Bucket ', b) bucket, count(amount) count 
from (select 'A' as b union select 'B' union select 'C') a 
left join tbl on b = 
    case when amount in (0, 1) then 'A' 
     when amount in (2,3,4,5) then 'B' 
     when amount in (6,7,8,9) then 'C' end 
group by 1 

這將產生一個排,一個零計數時沒有行剷鬥被發現。

SQLFiddle