Добавление строки - PullRequest
0 голосов
/ 30 мая 2019

Я строю диаграмму, и мне нужно, чтобы все заявленные дни были представлены для поданных заявок.В некоторые дни их может быть 5, а в других - 0. Я получаю свои данные из таблицы приложений, но мне нужно добавить строку для дат, которые не имеют значения.Например сегодня 29 мая и 3 человека подали заявку.21.05 подали заявки 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 Ответ

3 голосов
/ 30 мая 2019

Непонятно, как «добавление строки» связано с диаграммой или вставками ... Однако, просто сосредоточившись на запросе, можно использовать либо таблицу календаря, либо CTE , чтобы сгенерировать все даты в пределах определенной датыспектр.(Для больших наборов данных таблица календаря обычно лучше)Когда у вас есть даты, outer join верните их в таблицу приложений, чтобы получить счет за каждую дату.

Вы не упомянули, какую СУБД вы используете, но по синтаксису я угадываю 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, но эта тема показывает, как генерировать диапазон дат.Просто замените жестко закодированные даты на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...