按年份分组concat数据值

时间:2018-09-23 04:06:30

标签: php mysql foreach

我有一个查询,该查询将按当年月份中月份的总损失数据进行汇总。

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             [m] => 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组进行调整或为每个循环编写一个以创建以上数据?

1 个答案:

答案 0 :(得分:0)

尝试仅按年份分组,然后对所有月份的总和使用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;