Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Preciso montar um relatório que mostra a quantidade de inscrições por semana até uma determinada data, a query abaixo está funcionando bem:
SET @dia_evento = '2015-03-20';
SELECT WEEK( @dia_evento ) - WEEK(IFNULL(datacriacao, @dia_evento )) AS semanas_antes,
COUNT(*) AS total_inscritos
FROM tabela_inscricoes
GROUP BY semanas_antes DESC
Observem que temos a variável que indica o dia em que o evento começa, então a query mostra a "evolução" semana a semana. Mas tenho um problema: quando o ano "vira"... Nós temos alguns eventos cujas inscrições começam em um ano mas o evento é só no ano seguinte (por exemplo, as inscrições foram abertas em novembro de 2014 e o evento aconteceu em março de 2015) e não consigo mostrar os números...
Quando isso acontece, esse é o resultado obtido:
+---------+---------------+
| Semanas | Quantidade |
| Antes | de inscrições |
+---------+---------------+
| 15 | 13 |
| 14 | 45 |
| 13 | 98 |
| 12 | 151 |
| 11 | 135 |
| 10 | 823 |
| 9 | 1059 |
| 8 | 663 |
| 7 | 1217 |
| 6 | 1610 |
| 5 | 1906 |
| 4 | 2016 |
| 3 | 3007 |
| 2 | 2705 |
| 1 | 7709 |
| 0 | 5354 |
| -35 | 1 |
| -36 | 7 |
| -37 | 11 |
+---------+---------------+
Alguém sabe uma forma de conseguir contornar essa situação?
Nao pode ser por year e week?
SELECT
Year( datacriacao ) ano, Week(datacriacao) semana, COUNT(*) AS total_inscritos
FROM tabela_inscricoes
where datacriacao <= @dia_evento
GROUP BY
Year(datacriacao) asc,
Week(datacriacao) asc
E pra fazer o que vc quer podemos tmb marretar para segunda-feira dividir por 7 arredondando pra baixo e exibir, ou seja:
SET @dia_evento = '2015-03-20';
select (floor(DATEDIFF(@dia_evento - INTERVAL Weekday(@dia_evento)), segunda) / 7)) semana_marreta,
count(*) total_inscritos
from
(
select
(datacriacao - INTERVAL Weekday(datacriacao) DAY) segunda
from tabela inscricoes
) a
Group by (floor(DATEDIFF(@dia_evento - INTERVAL Weekday(@dia_evento), segunda) / 7))Olá pessoal, vou tentar as sugestões de vocês e depois eu informo se deu certo, ok? Obrigado.
Mota, tentei com a sua query e obtive o seguinte resultado:
SELECT YEAR( datainsc ) AS `ano`,
WEEK( @dia_evento ) - WEEK(IFNULL(datainsc, @dia_evento )) AS `semanas_antes`,
COUNT(*) AS `total_inscritos`
FROM tabela inscricoes
GROUP BY `ano`,
`semanas_antes` DESC;
--------------------
Results:
+------+---------+------------+
| Ano | Semanas | Qde. Insc. |
+------+---------+------------+
| 2014 | -36 | 7 |
| 2014 | -37 | 11 |
| 2015 | 15 | 13 |
| 2015 | 14 | 45 |
| 2015 | 13 | 98 |
| 2015 | 12 | 151 |
| 2015 | 11 | 135 |
| 2015 | 10 | 823 |
| 2015 | 9 | 1059 |
| 2015 | 8 | 663 |
| 2015 | 7 | 1217 |
| 2015 | 6 | 1610 |
| 2015 | 5 | 1906 |
| 2015 | 4 | 2016 |
| 2015 | 3 | 3007 |
| 2015 | 2 | 2705 |
| 2015 | 1 | 7709 |
| 2015 | 0 | 5357 |
+------+---------+------------+
Quase lá, mas o desafio seria conseguir identificar quantas semanas isso representa em relação ao primeiro dia do evento, no caso a semana -37 e -36...
giesta, com a sua primeira query eu obtive o seguinte resultado:
SELECT YEAR( datainsc ) AS `ano`,
WEEK( datainsc ) AS `semanas_antes`,
COUNT(*) AS `total_inscritos`
FROM tabela inscricoes
GROUP BY YEAR( datainsc ) ASC,
WEEK( datainsc ) ASC;
--------------------
Results:
+------+---------+------------+
| Ano | Semanas | Qde. Insc. |
+------+---------+------------+
| 2014 | 51 | 7 |
| 2014 | 52 | 11 |
| 2015 | 0 | 13 |
| 2015 | 1 | 45 |
| 2015 | 2 | 98 |
| 2015 | 3 | 151 |
| 2015 | 4 | 135 |
| 2015 | 5 | 823 |
| 2015 | 6 | 1059 |
| 2015 | 7 | 663 |
| 2015 | 8 | 1217 |
| 2015 | 9 | 1610 |
| 2015 | 10 | 1906 |
| 2015 | 11 | 2016 |
| 2015 | 12 | 3007 |
| 2015 | 13 | 2705 |
| 2015 | 14 | 7709 |
| 2015 | 15 | 5358 |
+------+---------+------------+
Tem alguma coisa estranha... E a segunda query não consegui executar, está com erro e não consegui identificar onde é:
SELECT ( FLOOR(DATEDIFF(@dia_evento - INTERVAL WEEKDAY(@dia_evento)), segunda) / 7) ) semana_marreta,
COUNT(*) total_inscritos
FROM ( SELECT (datainsc - INTERVAL WEEKDAY(datainsc) DAY) segunda FROM tabela inscricoes ) a
GROUP BY ( FLOOR(DATEDIFF(@dia_evento - INTERVAL WEEKDAY(@dia_evento), segunda) / 7) );
--------------------
Results:
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '), segunda) / 7) ) semana_marreta,
COUNT(*) total_inscritos
FROM ' at line 1
Tem alguma coisa estranha... E a segunda query não consegui executar, está com erro e não consegui identificar onde é:
Não tem nada de errado, a ideia é exibir os dados de maneira diferente
No caso da segunda consulta, sobrou/faltou um parentesis, basta ajeitar.
Olá giesta, eu tentei arrumar, coloquei/retirei parênteses, mas não consegui...
select (floor(DATEDIFF(@dia_evento - INTERVAL Weekday(@dia_evento), segunda) / 7)) semana_marreta,
count(*) total_inscritos
from
(
select
(datacriacao - INTERVAL Weekday(datacriacao) DAY) segunda
from tabela inscricoes
) a
Group by (floor(DATEDIFF(@dia_evento - INTERVAL Weekday(@dia_evento), segunda) / 7))
Olá giesta, não consigo rodar a query... Aparece a mesma mensagem de erro de sintaxe... O que será que pode ser? Tentei alterar diversas coisas, pensei que pudesse ser o uso da variável @dia_evento, mas nada...
O problema é que eu nunca fui mto bom quando tem um excesso de parentesis :P
A query em si ta certa.
O que ela faz:
1- transforma todas as datas em segunda-feiras,
2- calcula a diferença entre a segunda-feira anterior a @dia_evento
3- calcula a distância em dias entre a segunda do dia evento e as varias outras segundas
4- Divide o valor por 7 e arredonda pra baixo
5- :)
Será que pode ser a versão do MySQL? Porque eu tentei "quebrar" cada pedaço e executar isoladamente e não vai...
Tô quase desistindo... -_-
'2015-12-22' é o @diaevento
dia_corte é datacriacao
corte_religa.corte é a tabela.
Modifique que funciona
select
FLOOR(
DATEDIFF(
('2015-12-22' - INTERVAL Weekday('2015-12-22') DAY),
(dia_corte - INTERVAL Weekday(dia_corte) DAY)
)
/7)
,count(*)
semana_marreta
from corte_religa.corte
group by
FLOOR(
DATEDIFF(
('2015-12-22' - INTERVAL Weekday('2015-12-22') DAY),
(dia_corte - INTERVAL Weekday(dia_corte) DAY)
)
/7)