SQL-запрос для агрегирования данных по месяцам (Postgres) - PullRequest
0 голосов
/ 12 июня 2018

Запрашиваемая мной таблица:

таблица testing_table:

testType | period_from | period_to| copies |
       1 |     20180101|  20181201|       1|
       2 |    20180101 |  20191201|       1|
       3 |     20190101|  20191201|       1|

Я хочу пройтись по массиву и использовать приведенный ниже запрос для генерации таких значений:

DateVar | ABTEST | CDTEST | EFTEST |
20180101|       4|       0|       0|
20180201|       3|       4|       2|

dateVar = ['20180101', '20180201', '20180501'].

Я пытаюсь разработать SQL-запрос наподобие этого:

SELECT
     SUM (
     CASE
     WHEN (testType = 1 AND (period_from <= dateVar AND period_to >= dateVar)) THEN
     copies
     ELSE
     0
     END
     ) AS "ABTEST",
     SUM (
     CASE
     WHEN (testType = 2 AND (period_from <= dateVar AND period_to >= dateVar)) THEN
     copies
     ELSE
     0
     END
     ) AS "CDTEST",
     SUM (
     CASE
     WHEN (testType = 3 AND (period_from <= dateVar AND period_to >= dateVar)) THEN
     copies
     ELSE
     0
     END
     ) AS "EFTEST"
    FROM
     testing_table;

Я заблудился относительно того, что с ним делать.Я смотрю на функции?

1 Ответ

0 голосов
/ 13 июня 2018

Я думаю, вам следует использовать функцию unnest для выполнения того, что вы просите. Я написал запрос, который вы можете проверить

SELECT DTVAR, 
            SUM(CASE 
            WHEN TestType = 1
                THEN copies
            ELSE 0
            END) AS 'ABTEST', 
            SUM(CASE 
            WHEN TestType = 2
                THEN copies
            ELSE 0
            END) AS 'CDTEST', 
            SUM(CASE 
            WHEN TestType = 3
                THEN copies
            ELSE 0
            END) AS 'EFTEST'
FROM (
    SELECT DTVAR, TestType, sum(copies) AS copies
    FROM testing_table
    INNER JOIN (
        SELECT DTVAR
        FROM unnest(dateVar ['20180101','20180201','20180501']) AS DTVAR
        ) AA
        ON (
                period_from <= DTVAR
                AND period_to >= DTVAR
                )
    GROUP BY DTVAR, TestType
    ) A
GROUP BY DTVAR

надеюсь, это поможет ..

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