Группировать значения конкатных данных по годам - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть запрос, который будет суммировать общую потерю данных по месяцам за текущий год.

SELECT label, m, coalesce(sum(total_loss), 0) as data
    FROM (
        SELECT label, m
        FROM
        (
            SELECT YEAR(CURDATE()) label UNION ALL SELECT YEAR(CURDATE())-1 
        ) years,

        (
            SELECT 01 m UNION ALL SELECT 02 UNION ALL SELECT 03 UNION ALL SELECT 04
            UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 UNION ALL SELECT 08
            UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
        ) months
    ) ym
    LEFT JOIN incident ON ym.label = YEAR(incident.incident_date) AND ym.m = MONTH(incident.incident_date)
    GROUP BY label, m

Выходные данные:

Массив ([0] => Массив ([метка] => 2017 [м] => 1 [данные] => 0)

[1] => Array
    (
        [label] => 2017
        [m] => 2
        [data] => 0
    )

[2] => Array
    (
        [label] => 2017
        [m] => 3
        [data] => 0
    )

[3] => Array
    (
        [label] => 2017
        [m] => 4
        [data] => 0
    ) etc..

Это выдаст все 12 месяцев, а данные не будут равны 0.

Мне нужен какой-то групповой конкат, который выведет что-то вроде этого:

 {
     data: [0, 0, 0, 0, 0, 1100, 0, 0, 0, 0, 0, 0],
     label: '2017'}, 

Можно ли настроить с помощью concat группы или записать a для каждого цикла, чтобы создать данные выше?

1 Ответ

0 голосов
/ 23 сентября 2018

Попробуйте сгруппировать только по годам, а затем используйте GROUP_CONCAT для сумм за все месяцы:

SELECT
    label,
    GROUP_CONCAT(COALESCE(SUM(total_loss), 0)) AS data
FROM
(
    SELECT label, m
    FROM
    (
        SELECT YEAR(CURDATE()) label UNION ALL SELECT YEAR(CURDATE())-1 
    ) years,
    (
        SELECT 01 m UNION ALL SELECT 02 UNION ALL SELECT 03 UNION ALL SELECT 04
        UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 UNION ALL SELECT 08
        UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
    ) months
) ym
LEFT JOIN incident
    ON ym.label = YEAR(incident.incident_date) AND
       ym.m = MONTH(incident.incident_date)
GROUP BY label;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...