您可以使用聚合函數內部的CASE表達式,將得到的結果列:
SELECT
COUNT(case when amount >= 0 and amount <= 100 then users.id end) Amt0_100,
COUNT(case when amount >= 101 and amount <= 200 then users.id end) Amt101_200,
COUNT(case when amount >= 201 and amount <= 300 then users.id end) Amt201_300
FROM transactions
LEFT JOIN users
ON users.id = transactions.user_id;
見SQL Fiddle with Demo
你會發現,我改變了範圍從0到100,101 -200,201-300,否則你將有用戶id在100,200的值上計數兩次。
如果你想在每行的值,那麼你可以使用:
select count(u.id),
CASE
WHEN amount >=0 and amount <=100 THEN '0-100'
WHEN amount >=101 and amount <=200 THEN '101-200'
WHEN amount >=201 and amount <=300 THEN '101-300'
END Amount
from transactions t
left join users u
on u.id = t.user_id
group by
CASE
WHEN amount >=0 and amount <=100 THEN '0-100'
WHEN amount >=101 and amount <=200 THEN '101-200'
WHEN amount >=201 and amount <=300 THEN '101-300'
END
見SQL Fiddle with Demo
但如果你有,你需要在計算計數許多範圍,那麼你可能想考慮範圍創建表,類似於以下內容:
create table report_range
(
start_range int,
end_range int
);
insert into report_range values
(0, 100),
(101, 200),
(201, 300);
然後你就可以使用此表加入到當前的表和組由RAN ge值:
select count(u.id) Total, concat(start_range, '-', end_range) amount
from transactions t
left join users u
on u.id = t.user_id
left join report_range r
on t.amount >= r.start_range
and t.amount<= r.end_range
group by concat(start_range, '-', end_range);
參見SQL Fiddle with Demo。
如果你不想創建範圍的新表,那麼你可以隨時使用派生表來獲得相同的結果:
select count(u.id) Total, concat(start_range, '-', end_range) amount
from transactions t
left join users u
on u.id = t.user_id
left join
(
select 0 start_range, 100 end_range union all
select 101 start_range, 200 end_range union all
select 201 start_range, 300 end_range
) r
on t.amount >= r.start_range
and t.amount<= r.end_range
group by concat(start_range, '-', end_range);
見SQL Fiddle with Demo
爲什麼不只是三個查詢? –
這只是一個簡單的例子,實際上我需要更多的範圍。 –