举个例子,有一张订单表,订单有多个订单类型,有需求需要统计7月份每天的订单总量,订单类型A的订单量,订单类型B的订单量,其他的订单类型的订单量,订单类型A的占比,订单类型B的占比;
订单字段有主键订单order_id,订单号order_no,订单类型order_type,订单下单时间order_date。
这类通过日期统计订单数量的sql,一般都是通过分组group by ,和select 子查询就可以实现,具体业务可能不同,但是整体结构不会有很大变化
具体的sql脚本实现
SELECT
TT.下单日期,
TT.当月订单总量,
TT.订单类型A总量,
TT.订单类型B总量,
(
CASE
WHEN tt.订单类型A总量 = 0 THEN
'0.00%' ELSE ( TO_CHAR( round( tt.订单类型A总量 * 100 :: NUMERIC /当月订单总量:: NUMERIC, 2 ), 'FM99990.00' ) || '%' )
END
) 订单类型A的占比率,
(
CASE
WHEN tt.订单类型B总量 = 0 THEN
'0.00%' ELSE ( TO_CHAR( round( tt.订单类型B总量 * 100 :: NUMERIC /当月订单总量:: NUMERIC, 2 ), 'FM99990.00' ) || '%' )
END
) 订单类型A的占比率,
(
SELECT
下单日期 下单日期,
COUNT ( 0 ) 当月订单总量,
SUM ( CASE T.ORDER_TYPE WHEN 'A' THEN 1 ELSE 0 END ) 订单类型A总量,
SUM ( CASE T.ORDER_TYPE WHEN 'B' THEN 1 ELSE 0 END ) 订单类型B总量
FROM
(
SELECT
TO.ORDER_NO 订单号,
to_char( TO.ORDER_DATE, 'yyyy-MM-dd' ) 下单日期,
TO.ORDER_TYPE 订单类型
FROM
TABLE_ORDER TO
WHERE
TO.ORDER_DATE >= TO_TIMESTAMP('2023-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' )
AND TO.ORDER_DATE <= TO_TIMESTAMP('2023-07-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS' )
) T
GROUP BY
下单日期
ORDER BY
下单日期
) TT