向查询结果中插入空数据


在写一个查询的时候遇到一个问题:我要查询某个月的订单,查询结果中会列出当月所有订单,但结果不是我想要的,因为,在这一个月中并不是每一天都有订单,比如,1、2、10、11、14、19、24号有订单,其他天没有订单。我想要的结果是,如果这个月某天没订单,则订单数为0。

   
  SELECT
  
TO_CHAR(COUNT(DISTINCT EOOR.EOOR_ORDER_NO)) AS ORDERS, -- 总订单数
TO_CHAR(EOOR.EOOR_ORDER_TIME,'DD') AS THEDAY, -- 这个月第N天
EOOR.EOOR_ORDER_DEPARTMENT_NAME AS OBJECT, -- 其他标志,不用理会
'1.总订单数 ' AS THETYPE, -- 同上
'DEPARTMENT' AS ROLE -- 其他标志,不用理会
FROM EO_ORDER EOOR
LEFT JOIN EO_ORDER_MILESTONE EOOM
ON EOOR.EOOR_ORDER_NO = EOOM.EOOM_ORDER_NO
AND EOOM.EOOM_ORDER_NO IS NOT NULL
WHERE 1 = 1
AND TO_CHAR(EOOR.EOOR_ORDER_TIME,'YYYY-MM') = '2013-08'
GROUP BY EOOR.EOOR_ORDER_DEPARTMENT_NAME,TO_CHAR(EOOR.EOOR_ORDER_TIME,'DD')

数据库 oracle

八云はまじ 12 years, 4 months ago

刚才理解错题目意思了. 我想可以这样吧, 仅供参考.

假设你现在的sql已经可以输出结果集RES:

   
  DAY   NUM
  
01 12
02 23
...
24 222

那么构造一个临时表TMP放入当前月的所有天数:

   
  DAY
  
01
02
03
04
...
24
31

然后TMP left join RES on TMP.day=RES.day. select里用NVL处理RES.NUM为NULL的情况.

比较麻烦的是要考虑一个月有多少天.

不用临时表, 我记得看过一篇文, oracle可以用connect level来构造序列.

当然最好是可以从数据库的某张已存在的表里 把这个序列构造出来.

卫宫士郎他爹 answered 12 years, 4 months ago

Your Answer