none
Select para "quebrar" o mês em duas quinzenas RRS feed

  • 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
    
    quarta-feira, 4 de agosto de 2010 16:53

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
    quarta-feira, 4 de agosto de 2010 18:43

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
    quarta-feira, 4 de agosto de 2010 18:02
  • 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

    quarta-feira, 4 de agosto de 2010 18:02
  • 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

    quarta-feira, 4 de agosto de 2010 18:11
  • Sérgio,

    Pelo script que vc postou aparentemente vc não implementou essa "transformacao" no group by também, conforme sugeriu o Fausto:

    Group by FLOOR(LOG(Datepart(day, data_medicao))/LOG(15))

    att.
    Rafael

    quarta-feira, 4 de agosto de 2010 18:16
  • 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
    quarta-feira, 4 de agosto de 2010 18:19
  • 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
    quarta-feira, 4 de agosto de 2010 18:43