Tenho as seguintes tabelas:
Tabela campanha:
CREATE TABLE `campanha` (
`id_campanha` int(11) NOT NULL AUTO_INCREMENT,
`ds_nome` varchar(255) DEFAULT NULL,
`dt_local` datetime DEFAULT NULL,
`user_sistema` varchar(255) DEFAULT NULL,
`dt_inicio` datetime DEFAULT NULL,
`dt_final` datetime DEFAULT NULL,
`ativa` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id_campanha`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4;
Tabela questao:
CREATE TABLE `questao` (
`id_questao` int(11) NOT NULL AUTO_INCREMENT,
`id_campanha` int(11) DEFAULT NULL,
`ds_nome_questao` varchar(255) DEFAULT NULL,
`ds_questao` varchar(255) DEFAULT NULL,
`dt_local` datetime DEFAULT NULL,
`user_sistema` varchar(255) DEFAULT NULL,
`tipo` varchar(1) DEFAULT NULL,
`tipo_resposta` varchar(20) DEFAULT NULL,
`ordem_questao` int(11) DEFAULT NULL,
PRIMARY KEY (`id_questao`)
) ENGINE=InnoDB AUTO_INCREMENT=179 DEFAULT CHARSET=utf8mb4;
Tabela voucher:
CREATE TABLE `voucher` (
`id_voucher` int(11) NOT NULL AUTO_INCREMENT,
`id_campanha` int(11) DEFAULT NULL,
`ds_voucher` varchar(255) DEFAULT NULL,
`qt_voucher` int(11) DEFAULT NULL,
`ativo` tinyint(1) DEFAULT NULL,
`user_sistema` varchar(255) DEFAULT NULL,
`dt_local` datetime DEFAULT NULL,
PRIMARY KEY (`id_voucher`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;
Estou tentando retornar a seguinte estrutura:
id_campanha | ds_nome | dt_inicio | dt_final | qt_voucher | voucher_ativo | voucher_desativado | qt_quetoes |
---|---|---|---|---|---|---|---|
31 | O que você acha do refeitório | 09/11/2021 | 10/11/2021 | 0 | 0 | 0 | 6 |
30 | Você está feliz em seu serviço | 08/11/2021 | 09/11/2021 | 0 | 0 | 0 | 5 |
29 | Campanha nome exemplo | 04/11/2021 | 08/11/2021 | 10 | 9 | 1 | 4 |
Montei o seguinte select no MySQL
SELECT DISTINCT
a.id_campanha,
a.ds_nome,
a.dt_local,
a.user_sistema,
a.dt_inicio,
a.dt_final,
a.ativa,
b.qt_voucher,
SUM(case when b.ativo = 1 then 1 else 0 end) over(partition by b.id_campanha) as voucher_ativo,
SUM(case when b.ativo = 0 then 1 else 0 end) over(partition by b.id_campanha) as voucher_desativado,
count(c.id_campanha) over(partition by a.id_campanha) as qt_questoes
FROM campanha a
left join voucher b on a.id_campanha = b.id_campanha
left join questao c on a.id_campanha = c.id_campanha
ORDER BY a.id_campanha
Mas meu retorno está assim:
Não consigo uma somatório dos vouchers ativos e desativados correta com a função:
SUM(case when b.ativo = 1 then 1 else 0 end) over(partition by b.id_campanha) as voucher_ativo,
SUM(case when b.ativo = 0 then 1 else 0 end) over(partition by b.id_campanha) as voucher_desativado,
E contagem das questões por campanha com a função:
count(c.id_campanha) over(partition by a.id_campanha) as qt_questoes
O que está errado? Se alguém tiver outra lógica para montar esse select, por favor poderia me ajudar.