Oracle中查询数据库,使用了group by,因为所要查询的条件内的数据是恰好没有值的,所以结果显示为空值,但这不是我想要的,具体问题描述如下

问题描述:

  • 例如我查询成功取票数(STATE = 1)为:
SELECT BOOK_TICKET_ITEM_ID, COUNT(1) AS SUCCESS_DRAW_NUMBER FROM T_BOOK_SESSION WHERE AREA_ID=10097 AND TO_DATE('2020-09-21 00:00:00', 'yyyy-mm-dd hh24:mi:ss') <= BOOKING_DATE AND 
TO_DATE('2020-09-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss') >= BOOKING_DATE AND STATE = 0 GROUP BY BOOK_TICKET_ITEM_ID
  • 显示结果为(也是正是我想要的结果类型):
    图片说明

  • 但是我想要查找取消预约的票数(STATE = 2),就不能得到类似成功取票数的结果,sql为

    SELECT BOOK_TICKET_ITEM_ID, COUNT(1) AS CANCEL_BOOK_NUMBER FROM T_BOOK_SESSION WHERE AREA_ID=10097 AND TO_DATE('2020-09-21 00:00:00', 'yyyy-mm-dd hh24:mi:ss') <= BOOKING_DATE AND 
    TO_DATE('2020-09-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss') >= BOOKING_DATE AND STATE = 2 GROUP BY BOOK_TICKET_ITEM_ID
    

    图片说明

  • 因为state=2,是确实没有记录的,而group by是要求要有记录才行,否则显示空值,就是如上图所示。而我期待的结果为BOOK_TICKET_ITEM_ID=113 , CANCEL_BOOK_NUMBER=0 这样一条结果记录。哪位大神帮告诉下解决方案,十分感谢。

维度基数补充,给你两点建议。如果你所需要的维度基数过大,基数更新频率很低或者根本不更新,那么建议你生成一张维表,以这张维表作为主表去关联你的事实表,空值给0就可以了。如果维度基数很小或者是更新频率很快,那么就需要你手动去获取这个维度值。比如你的stat=2下没有113这个ID,那么你就需要手动生成一张维度表,让stat=2对应的有id113。或者从其它表中获取到有对应的全部维度。

用SUM函数,把STATE作为计算条件

SELECT BOOK_TICKET_ITEM_ID, SUM(CASE WHEN STATE = 2 THEN 1 ELSE 0 END) AS CANCEL_BOOK_NUMBER FROM T_BOOK_SESSION WHERE AREA_ID=10097 AND TO_DATE('2020-09-21 00:00:00', 'yyyy-mm-dd hh24:mi:ss') <= BOOKING_DATE AND
TO_DATE('2020-09-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss') >= BOOKING_DATE GROUP BY BOOK_TICKET_ITEM_ID

你用BOOK_TICKET_ITEM_ID主表左连接T_BOOK_SESSION 表,如果主表有BOOK_TICKET_ITEM_ID=113的记录,那么结果就有,不能单独查T_BOOK_SESSION直接捏造一条记录