我正在尝试将找不到的日期的记录显示为零。
以下是我的基本查询:
Select date_col, count(distinct file_col), count(*) from tab1
where date_col between 'date1' and 'date2'
group by date_col;
输出为一个日期。
我希望所有日期都显示在结果中。
答案 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;
在此示例中,显示了如何生成月份周期的序列。