Получение «заполнителей» пустых значений для GROUP BY - PullRequest
0 голосов
/ 31 декабря 2018

Если я хочу получать «еженедельные» результаты из диапазона дат, а диапазон дат содержит четыре отдельные недели, но в моей базе данных есть запись только за одну неделю, как я могу получить значения заполнителя за оставшиеся три недели?

Например, с учетом этого диапазона дат: 6/2018 - 7/2018

Я выполняю этот запрос:

SELECT
 DATE_FORMAT(period, '%m %d') || ' - ' || DATE_FORMAT(period, '%m %d') AS period,
 SUM(clicks) AS clicks
FROM tablename
WHERE period >= ? AND period <= ?
GROUP BY YEAR(period), WEEK(period)

С этими строками таблицы в базе данных:

|         period          | clicks |
|  07/01/2018T:00:00:00Z  |  1000  | 

И я получаю следующие результаты запроса:

|     period      | clicks |
|  Jul 1 - Jul 5  |  1000  | 

Но я хочу, чтобы эти результаты запроса охватывали значения по умолчанию для пустых недель, чтобы я мог использовать их для заполнения диаграммы d3:

|     period      | clicks |
|  Jul 1 - Jul 5  |  1000  | 
| Jun 25 - Jun 23 |  0     |
| Jun 18 - Jun 24 |  0     |
| Jun 12 - Jun 18 |  0     |

Есть идеи?Этот вид «наполнителя» должен быть достаточно общим, чтобы работать с другими интервалами, такими как ежедневный, ежемесячный, ежегодный, почасовой.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Вы можете использовать этот запрос, чтобы сгенерировать недели, а затем оставить соединение с текущим запросом, чтобы получить то, что вы хотите.

DECLARE @StartingFromDate DATETIME = '2018-12-01';
DECLARE @EndingAtDate DATETIME = '2018-12-31';

WITH CTE_DateRange (DateRange)
    AS (SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, @EndingAtDate) - DATEDIFF(WEEK, @StartingFromDate, @EndingAtDate), 0)
        UNION ALL
        SELECT DATEADD(WEEK, 1, DateRange)
        FROM CTE_DateRange
        WHERE DATEADD(WEEK, 1, DateRange) < @EndingAtDate)
SELECT CTE_DateRange.DateRange
FROM CTE_DateRange
WHERE CTE_DateRange.DateRange BETWEEN @StartingFromDate AND @EndingAtDate
0 голосов
/ 31 декабря 2018

переписать ваш запрос как

ifnull( SUM(clicks),0) AS clicks
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...