使用SQL 的CASE 語句做分時段統計

2021-10-20 18:05:31 字數 2329 閱讀 7915

某日老闆突然要求,想看各時段的訂單數量。心想,訂單表中有紀錄時間點,這應該不成問題,只是這 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 ...