oracle求个sql语句,根据当天每小时进行分组查询,如果没数据默认0。该怎么实现?

sql已准备好,把这两个sql拼成一个。以tool表小时数据为基准,只需要8-16每小时的数据。

如果不需要tool表也可以实现,那样最好,谢谢了

数据表“T_IVR_DETAIL_LOG”

SELECT
    TO_CHAR (CURRENTDT, 'hh24') AS HH,
    COUNT (*) num
FROM
    T_IVR_DETAIL_LOG
WHERE
    TO_CHAR (
        TRUNC (CURRENTDT),
        'yyyy-mm-dd'
    ) = (
        SELECT
            TO_CHAR (SYSDATE, 'yyyy-mm-dd')
        FROM
            DUAL
    )
GROUP BY
    TO_CHAR (CURRENTDT, 'hh24')
ORDER BY
    TO_CHAR (CURRENTDT, 'hh24')

图片说明

小时表

SELECT
    T.HH,
    T.NUM
FROM
    SYS_TOOL T
ORDER BY T.HH

图片说明

或者这样。我举个简单的例子。

图片说明

SELECT
ST,HH,
COUNT(TIDL.*)
FROM
SYS_TOOL ST
LEFT JOIN T_IVR_DETAIL_LOG TIDL
ON ST.HH = TO_CHAR(TIDL.CURRENTDT, 'HH24')
GROUP BY ST.HH
ORDER BY ST.HH;

    SET @Time='1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20';

    SELECT  ht.businessAt,IFNULL(st.NUM,0) NUM FROM (
        select substring_index(substring_index(@Time,',',help_topic_id+1),',',-1) as businessAt
        from 
        mysql.help_topic 
        where help_topic_id<(length(  @Time)-length(replace( @Time,',',''))+1)
    )ht  
    LEFT JOIN SYS_TOOL st ON st.HH = ht.businessAt 
    ORDER BY CAST(ht.businessAt AS UNSIGNED int ) ASC

这个sql用到了你要的业务数据表,和mysql系统表,若是你不想用系统表,那也可以参考这个sql转化

SELECT
st.HH,
IFNULL(sa.NUM,0)

FROM
SYS_TOOL st
LEFT JOIN SYS_AAA sa ON sa.HH = st.HH
ORDER BY st.HH ASC

select st.HH, nvl(t.num, 0)
from SYS_TOOL st
         left join (SELECT TO_CHAR(CURRENTDT, 'hh24') AS HH,
                           COUNT(*)                      num
                    FROM T_IVR_DETAIL_LOG
                    WHERE TO_CHAR(
                                  TRUNC(CURRENTDT),
                                  'yyyy-mm-dd'
                              ) = (
                              SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd')
                              FROM DUAL
                          )
                    GROUP BY TO_CHAR(CURRENTDT, 'hh24')) t on st.HH = t.HH order by HH;