如何将不在表的记录中的日期显示为零

时间:2018-06-26 10:57:43

标签: sql

我正在尝试将找不到的日期的记录显示为零。

以下是我的基本查询:

Select date_col, count(distinct file_col), count(*) from tab1
where date_col between 'date1' and 'date2'
group by date_col;

输出为一个日期。

我希望所有日期都显示在结果中。

2 个答案:

答案 0 :(得分:0)

处理此类问题的一般方法是使用称为 calendar 的表。该日历表包含要显示在报告中的所有日期。我们可以使用子查询创建一个粗略的

SELECT
    t1.date,
    COUNT(DISTINCT t2.file_col) AS d_cnt,
    COUNT(t2.file_col) AS cnt
FROM
(
    SELECT '2018-06-01' AS date UNION ALL
    SELECT '2018-06-02' UNION ALL
    ...
) t1
LEFT JOIN tab1 t2
    ON t1.date = t2.date_col
WHERE
    t1.date BETWEEN 'date1' and 'date2'
GROUP BY
    t1.date;

关键在这里是我们将日历表与包含实际数据的表保持连接,但是我们在您的数据表中计数一列。这意味着在没有匹配数据的任何一天都将报告为零。

答案 1 :(得分:0)

如果使用的是postgreSQL,则可以生成带有必要日期周期的序列。

SELECT
    t1.date,
    COUNT(DISTINCT t2.file_col) AS d_cnt,
    COUNT(t2.file_col) AS cnt
FROM
(
  select to_char( '?'::DATE + (interval '1' month * generate_series(0,11)),'yyyy-mm-dd')as month) x
    ...
) t1
LEFT JOIN tab1 t2
    ON t1.date = to_char(t2.date_col,'yyyy-mm')
WHERE
    t1.date BETWEEN 'date1' and 'date2'
GROUP BY
    t1.date;

在此示例中,显示了如何生成月份周期的序列。