我正在构建一个图表,需要将指定月份中的所有日子都代表提交的申请。在某些日子中,可能有5个,在另一些日子中,可能是0。我从应用程序表中获取数据,但是我需要为没有值的日期附加字符串。例如,今天是05/29,则应用了3个人。在05/21,有2人申请。在此期间(之前),没有其他应用。因此,我需要获取这些日期并为其存储一个0值。
以下是我用来带回并分组数据的内容:
SELECT DISTINCT to_char ("applicationdate",'mm') AS applicationmonth
, to_char ("applicationdate",'dd') AS applicationdate
, to_char ("applicationdate", 'yyyy') AS applicationyear
, term
, COUNT(*) AS count
FROM campapplications.basketball
WHERE term = 'SU'
GROUP BY applicationdate, term
ORDER BY applicationdate, term
最后,我正在插入。
我已经看过其他地方,但是除了使用listAppend()
函数之外,还没有得到任何输入。
答案 0 :(得分:3)
尚不清楚“附加字符串”与图表或插入之间的关系...但是,仅关注查询,可以使用日历表或CTE来生成特定日期范围内的所有日期。 (对于较大的数据集,通常最好使用日历表)。获得日期后,outer join
将它们返回到您的应用程序表以获取每个日期的计数。
您没有提到正在使用哪个DBMS,但是从语法上我猜测是Oracle。假设“ applicationDate”列仅包含日期(无时间),则以下查询将返回给定范围内的所有日期的计数:#startDate#
和#endDate#
。根据需要调整日期。
SQL: http://sqlfiddle.com/#!4/c09877/2
WITH CTE(TheDate) AS
(
SELECT FromDate+level-1
FROM (
SELECT <cfqueryparam value="#startDate#" cfsqltype="cf_sql_date"> AS FromDate
, <cfqueryparam value="#endDate#" cfsqltype="cf_sql_date"> AS ToDate
FROM dual
) d
CONNECT BY LEVEL <= ToDate - FromDate + 1
)
SELECT TheDate
, COUNT(b.applicationDate) AS count
FROM cte LEFT JOIN basketball b ON b.applicationDate = cte.TheDate
GROUP BY TheDate
ORDER BY TheDate
;
样本结果:
| THEDATE | COUNT |
|----------------------|-------|
| 2019-05-21T00:00:00Z | 2 |
| 2019-05-22T00:00:00Z | 0 |
| 2019-05-23T00:00:00Z | 0 |
| 2019-05-24T00:00:00Z | 0 |
| 2019-05-25T00:00:00Z | 0 |
| 2019-05-26T00:00:00Z | 0 |
| 2019-05-27T00:00:00Z | 0 |
| 2019-05-28T00:00:00Z | 0 |
| 2019-05-29T00:00:00Z | 3 |
更新:
我对PostgreSQL不太满意,但是this thread显示了如何生成日期范围。只需将硬编码日期替换为cfqueryparam。
SQL: http://sqlfiddle.com/#!15/2a0a7/4
SELECT TheDate
, COUNT(b.applicationDate) AS count
FROM generate_series
( '2019-05-21'::date
, '2019-05-29'::date
, '1 day'::interval) TheDate
LEFT JOIN basketball b ON b.applicationDate = TheDate
GROUP BY TheDate
ORDER BY TheDate