MySQL combinando COUNT, MAX e SUM
No MySQL, eu gostaria de ter uma coluna extra mostrando a soma dos valores de uma coluna específica. No entanto, os números que gostaria de somar vêm de uma subconsulta e não são armazenados em uma tabela separada, algo como isto:
(SELECT a.ID, MAX(a.COUNT_ID) AS MAX_COUNT FROM
(SELECT ID, COUNT(*) AS COUNT_ID
FROM my_table
GROUP BY COL1, COL2) a
GROUP BY COL1, COL2) b
E isso produziria algo como:
ID MAX_COUNT
ABC 1
DEF 2
GHI 3
E agora, quero uma coluna extra mostrando a soma de MAX_COUNT, assim (repetida em todas as linhas):
ID MAX_COUNT SUM_MAX_COUNT
ABC 1 6
DEF 2 6
GHI 3 6
O objetivo real é realmente mostrar a porcentagem MAX_COUNT do total MAX_COUNT, então 1/6, 2/6 e 3/6. Como eu faço isso? Eu já tentei fazer umCROSS JOIN
mas não funciona:
SELECT * FROM
((SELECT a.ID, MAX(a.COUNT_ID) AS MAX_COUNT FROM
(SELECT ID, COUNT(*) AS COUNT_ID
FROM my_table
GROUP BY COL1, COL2) a
GROUP BY COL1, COL2) b
CROSS JOIN (SELECT SUM(b.MAX_COUNT)) AS c
Erro: tabela desconhecida 'b'
EXEMPLO
Tabela de exemplo:
CREATE TABLE TABLE1 (
COL1 varchar(255),
COL2 varchar(255),
DAY int,
HOUR int);
INSERT INTO TABLE1 VALUES
('X','Y',1,12),
('X','Y',1,13),
('X','Y',1,13),
('A','B',2,19),
('X','B',3,13),
('X','B',3,13);
Agora eu quero ter, para cada combinação de COL1 e COL2, o número de linhas nesta tabela para cada hora:
SELECT COL1, COL2, HOUR, COUNT(*) AS COUNT_LINES
FROM TABLE1
GROUP BY DAY, HOUR, COL1, COL2;
O que gera isso:
COL1 COL2 HOUR COUNT_LINES
X Y 12 1
X Y 13 2
A B 19 1
X B 13 2
Agora eu quero, para cada combinação de COL1 e COL2, o máximo de COUNT_LINES, então uso a consulta acima em uma subconsulta:
SELECT a.COL1, a.COL2, MAX(a.COUNT_LINES)
FROM
(SELECT COL1, COL2, HOUR, COUNT(*) AS COUNT_LINES
FROM TABLE1
GROUP BY DAY, HOUR, COL1, COL2) a
GROUP BY COL1, COL2;
O que gera isso:
COL1 COL2 MAX(COUNT_LINES)
A B 1
X B 2
X Y 2
Agora, na última etapa, quero a coluna SUM of MAX (COUNT_LINES) em uma coluna separada, assim:
COL1 COL2 MAX(COUNT_LINES) SUM(MAX(COUNT_LINES))
A B 1 5
X B 2 5
X Y 2 5
Mas essa é a parte que eu não sei fazer.