某日老闆突然要求,想看各時段的訂單數量。心想,訂單表中有紀錄時間點,這應該不成問題,只是這 sql 語句該如何下?如果乙個小時統計一次,總不能分24次吧!
訂單資料表 orders 如下:
希望得出的結果如下:
利用 case 語句就能完成任務。
select
case
when date_format(t1.createtime,
"%h")=
0then
"h00"
when date_format(t1.createtime,
"%h")=
1then
"h01"
when date_format(t1.createtime,
"%h")=
2then
"h02"
when date_format(t1.createtime,
"%h")=
3then
"h03"
(…省略從 h04 ~ h22多行)
when date_format(t1.createtime,
"%h")=
23then
"h23"
else
"others"
endas hourid,
count
(t1.orderid)
as ordercx,
sum(t1.price)
as amount
from
`orders` t1
where
date
(t1.createtime)
between :arg1 and :arg2
group
by hourid
order
by hourid;
:arg1 及 :arg2 代表要查詢的日期區間。
但這個結果有個缺點,沒有訂單的時段,不會顯示出來,正確的結果應該如下:
想不出什麼好方法,索性弄出乙個 24 小時的表,如下:
然後用左外部鏈結(left outer join)的方式串聯起來,剛好就是所求。
select ta.title as orderhour, tb.ordercx, tb.amount
from
`category` ta left
outer
join
(select
case
when date_format(t1.createtime,
"%h")=
0then
"h00"
when date_format(t1.createtime,
"%h")=
1then
"h01"
when date_format(t1.createtime,
"%h")=
2then
"h02"
when date_format(t1.createtime,
"%h")=
3then
"h03"
(…省略從 h04 ~ h22多行)
when date_format(t1.createtime,
"%h")=
23then
"h23"
else
"others"
endas hourid,
count
(t1.orderid)
as ordercx,
sum(t1.price)
as amount
from
`orders` t1
where
date
(t1.createtime)
between :arg1 and :arg2
group
by hourid ) tb
on ta.id = tb.hourid
order
by orderhour;
幾個sql語句中的case使用
表結構 field type null key default extra id int 11 no pri name varchar 20 yes null char 1 yes null addr varchar 50 yes null 1.select id,name case when m ...
SQL語句case函式
case函式被習慣性的稱為流程控制函式 其主要應用有以下兩種 列舉這個字段 或者是該字段的函式 所有可能的值 形式為case when then when then else end例 select day when 1 then 星期一 when 2 then 星期二 when 3 then 星期...
SQL語句中 CASE 的用法
在寫sql語句時,或者是在pl sql中,經常需要在乙個sql語句中,根據不同的條件,有多種處理方法,如簡單例子 一種商品時,單價不同,折扣不同,對這種需求的處理,如果分情況處理,將會很麻煩,如果用case語句,就可以在一條sql語句中得到想要的結果。首先看一下,case的語法 case when ...