получить одну агрегированную строку mysql - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующий набор данных:

project_type_id  |   total_hours   |  task_completion
-------------------------------------------------------
10               |   5             |  2018-9-10
10               |   4             |  2018-9-11
11               |   10            |  2018-9-10
12               |   2             |  2018-9-10
13               |   9             |  2018-9-10
14               |   8             |  2018-9-11

Я пытаюсь получить total sum of hours для каждого доступного project_type в наборе данных для данного year ввода.

Вот мой запрос:

DROP PROCEDURE IF EXISTS getTaskHourReport;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `getTaskHourReport`(IN `year` INT)
BEGIN

SET GLOBAL group_concat_max_len=4294967295;
SET @SQL = NULL;
SET @year = year;

    SELECT
    COALESCE(GROUP_CONCAT(DISTINCT
    CONCAT(
    'SUM(CASE WHEN project_type_id = "',project_type_id,'" THEN total_hours ELSE 0 END) AS `',project_type_id,'`'
    )
), '0 as `NoMatchingRows`') INTO @SQL

        FROM `task_details`
        WHERE YEAR(task_completion) = @year;     

    SET @SQL 
    = CONCAT
    (
    '
        SELECT ', @SQL, ' 
        FROM
        task_details
        WHERE YEAR(task_completion) = @year
        GROUP BY project_type_id
    '
    );

PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


END$$
DELIMITER ;

Этот запрос дает мне следующий вывод:

10  |  11  |  12  |  13  |  14
-------------------------------
9   |  0   |  0   |  0   |  0
0   |  10  |  0   |  0   |  0
0   |  0   |  2   |  0   |  0
0   |  0   |  0   |  9   |  0
0   |  0   |  0   |  0   |  8

Ожидаемый результат:

10  |  11  |  12  |  13  |  14
-------------------------------
9   |  10  |  2   |  9   |  8

Как получить одинстрока как ожидалось?

1 Ответ

0 голосов
/ 10 октября 2018

Удалить GROUP BY.Итак:

SET @SQL = CONCAT('SELECT ', @SQL, ' ',
                  'FROM task_details '
                  'WHERE YEAR(task_completion) = @year'
                 );

Запрос агрегации без GROUP BY обрабатывает все строки как одну группу.Итак, он возвращает ровно одну строку.Это верно, даже если ссылочная таблица пуста или условия фильтрации удаляют все строки (в этом случае большинство функций агрегации возвращают NULL, хотя COUNT() возвращает 0).

...