Usuário com melhor resposta
Select para "quebrar" o mês em duas quinzenas

Pergunta
-
Pessoal,
Gostaria de criar mais um agrupamento no select abaixo, inserindo a informação da quinzena (1ª ou 2ª Quinzena), alguém já fez algo parecido?
SELECT YEAR(data_medicao) ano , lower(DATENAME(mm,data_medicao)) mes , transacao , COUNT(*) medicoes , AVG(cpu_time) avg_cpu , MAX(profile_name) max_profile FROM dbo.consumo_cpu_transacoes GROUP BY DATENAME(mm,data_medicao), YEAR(data_medicao) , transacao ORDER BY 5 DESC
Respostas
-
Valeu Pessoal,
Segue como ficou o resultado final
SELECT YEAR(data_medicao) ano , DATENAME(mm,data_medicao) mes , CASE WHEN FLOOR(LOG(Datepart(day, data_medicao))/LOG(15)) = 0 THEN 'Q1' ELSE 'Q2' END AS Quinzena, transacao , COUNT(*) medicoes , AVG(cpu_time) avg_cpu , MAX(profile_name) max_profile FROM dbo.consumo_cpu_transacoes GROUP BY FLOOR(LOG(Datepart(day, data_medicao))/LOG(15)), DATENAME(mm,data_medicao), YEAR(data_medicao) , transacao ORDER BY 5 DESC
- Marcado como Resposta sergioduarte quarta-feira, 4 de agosto de 2010 18:44
Todas as Respostas
-
Sergio, usa o calculo FLOOR(LOG(Datepart(day, data_medicao))/LOG(15)), ele vai retornar 0 para a primeira quinzena e 1 para a segunda, e da mesma forma, coloca ele no Group by:
Group by FLOOR(LOG(Datepart(day, data_medicao))/LOG(15))
Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco -
Sergio,
Quando eu usei, eu fiz simples assim:
DECLARE @TABELA TABLE (DATA SMALLDATETIME) INSERT INTO @TABELA (DATA) VALUES ('2010-08-01') INSERT INTO @TABELA (DATA) VALUES ('2010-08-14') INSERT INTO @TABELA (DATA) VALUES ('2010-08-15') INSERT INTO @TABELA (DATA) VALUES ('2010-08-16') INSERT INTO @TABELA (DATA) VALUES ('2010-08-31') SELECT DATA, CASE WHEN (DATEPART(dd,DATA) < 15) Then 'Primeira Quinzena' ELSE 'Segunda Quinzena' END FROM @TABELA
Vê se te ajuda!!!,
att.
Rafael -
Olá Pessoal,
As duas soluções funcionaram "mais ou menos"; a consulta retornava 300 e poucos registros, e agora retorna quase 1000, ou seja, aparentemente ele mostra a qual quinzena pertence o registro, porém não faz o agrupamento por quinzena..
SELECT YEAR(data_medicao) ano ,
LOWER(DATENAME(mm, data_medicao)) mes ,
'Quinzena' = CASE WHEN DAY(data_medicao) >= 15
THEN 'Quinzena 2'
ELSE 'Quinzena 1'
END ,
transacao ,
COUNT(*) medicoes ,
AVG(cpu_time) avg_cpu ,
MAX(profile_name) max_profile
FROM dbo.consumo_cpu_transacoes
GROUP BY DATENAME(mm, data_medicao) ,
DAY(data_medicao),
YEAR(data_medicao) ,
transacao
ORDER BY 5 DESC -
-
Sergio, utilizando como parametro a query abaixo.
Sim, provavelmente a quantidade de registro vai aumentar mesmo, veja que você agrupa por Ano e Mês e está acrescentando + um grupo o da quinzena, dessa forma você está especializando mais o seu select, a quantidade teria mesmo que no mínimo dobrar.
SELECT
FLOOR(LOG(Datepart(day, data_medicao))/LOG(15)),
YEAR(data_medicao) ano ,
lower(DATENAME(mm,data_medicao)) mes ,
transacao ,
COUNT(*) medicoes ,
AVG(cpu_time) avg_cpu ,
MAX(profile_name) max_profile
FROM dbo.consumo_cpu_transacoes
GROUP BY FLOOR(LOG(Datepart(day, dtInicioEvento))/LOG(15)),
DATENAME(mm,data_medicao),
YEAR(data_medicao) ,
transacao
ORDER BY 5 DESC
Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco- Sugerido como Resposta Rafael S. Melo quarta-feira, 4 de agosto de 2010 18:51
-
Valeu Pessoal,
Segue como ficou o resultado final
SELECT YEAR(data_medicao) ano , DATENAME(mm,data_medicao) mes , CASE WHEN FLOOR(LOG(Datepart(day, data_medicao))/LOG(15)) = 0 THEN 'Q1' ELSE 'Q2' END AS Quinzena, transacao , COUNT(*) medicoes , AVG(cpu_time) avg_cpu , MAX(profile_name) max_profile FROM dbo.consumo_cpu_transacoes GROUP BY FLOOR(LOG(Datepart(day, data_medicao))/LOG(15)), DATENAME(mm,data_medicao), YEAR(data_medicao) , transacao ORDER BY 5 DESC
- Marcado como Resposta sergioduarte quarta-feira, 4 de agosto de 2010 18:44