Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulo de Tarso F. M.

Query para exibir total de inscrições por semana

Recommended Posts

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:

# ------ Primeiro dia do evento ---------------- #
 
     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?

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT YEAR( @dia_evento )  ANO , WEEK( @dia_evento ) - WEEK(IFNULL(datacriacao, @dia_evento )) AS semanas_antes,
         COUNT(*) AS total_inscritos
    FROM tabela_inscricoes
GROUP BY YEAR( @dia_evento ) 
, semanas_antes DESC

pOR O ANO NA SQL NÃO RESOLVE ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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))

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites


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))

Compartilhar este post


Link para o post
Compartilhar em outros sites

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- :)

Compartilhar este post


Link para o post
Compartilhar em outros sites
'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)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.