Теперь у меня есть имя для того, чего я пытаюсь достичь. Это «динамическая кросс-таблица». Вот как я дошел до решения. Спасибо http://rpbouman.blogspot.com/2005/10/creating-crosstabs-in-mysql.html за четкие инструкции для получения здесь.
Линии 1-20 - настроить таблицу для использования.
Строки 22-29 - «статический» перекрестный запрос, предполагающий, что я знаю, сколько у меня требований
Спасибо D Mac за решение, которое вы дали:)
Линии 30-44 - Запрос, который динамически генерирует статический запрос выше.
Строки 45-72 - Вот тут у меня проблема. Цель состоит в том, чтобы создать хранимую процедуру, которая возвращает результат динамического запроса. MySQL говорит, что есть проблема с синтаксисом, но я не вижу, как это исправить. Есть мысли?
drop table if exists pivot;
create table `pivot` (
`req_id` int(11),
`testcase_id` int(11)
);
/*Data for the table `pivot` */
insert into `pivot`(`req_id`,`testcase_id`) values (1,4);
insert into `pivot`(`req_id`,`testcase_id`) values (2,4);
insert into `pivot`(`req_id`,`testcase_id`) values (3,4);
insert into `pivot`(`req_id`,`testcase_id`) values (4,7);
insert into `pivot`(`req_id`,`testcase_id`) values (1,7);
insert into `pivot`(`req_id`,`testcase_id`) values (2,12);
insert into `pivot`(`req_id`,`testcase_id`) values (3,12);
insert into `pivot`(`req_id`,`testcase_id`) values (4,4);
select * from pivot;
select testcase_id
, if(sum(req_id = 1), 1, 0)
, if(sum(req_id = 2), 1, 0)
, if(sum(req_id = 3), 1, 0)
, if(sum(req_id = 4), 1, 0)
from pivot
group by testcase_id;
select concat(
'select testcase_id','\n'
, group_concat(
concat(
', if(sum(req_id = ',p2.req_id,'), 1, 0)','\n'
)
order by p2.req_id
separator ''
)
, 'from pivot','\n'
, 'group by testcase_id;','\n'
) statement
from pivot p2
order by p2.req_id;
CREATE PROCEDURE p_coverage()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
begin
select concat(
'select testcase_id','\n'
, group_concat(
concat(
', if(sum(req_id = ',p2.req_id,'), 1, 0)','\n'
)
order by p2.req_id
separator ''
)
, 'from pivot','\n'
, 'group by testcase_id;','\n'
) statement
into @coverage_query
from pivot p2
order by p2.req_id;
prepare coverage from @coverage_query;
execute coverage;
deallocate prepare coverage;
end;
select * from pivot;