附加字符串

时间:2019-05-29 22:01:49

标签: postgresql coldfusion

我正在构建一个图表,需要将指定月份中的所有日子都代表提交的申请。在某些日子中,可能有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()函数之外,还没有得到任何输入。

1 个答案:

答案 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