none
PIVOT + WHERE RRS feed

  • Pergunta

  • Bom dia, 

    Estou criando uma Query para aplicar num ReportViewer, usando PIVOT.

    Até o momento está tranquilo, minha query é esta:

    SELECT BAIXA AS BAIXA, MÉDIA AS MEDIA, ALTA AS ALTA 
    FROM (SELECT PRIORIDADE, DT_ABERTURA FROM SOLICITACAO) AS S
    PIVOT 
    (COUNT(PRIORIDADE)FOR PRIORIDADE IN (BAIXA, MÉDIA, ALTA)) AS X

    O resultado obtido é esse:
                                   
    Baixa | Média | Alta|
        1    |    8     |   5  |

    Porém, existe uma coluna Data_abertura (na tabela original), e eu preciso retornar os resultados acima, de acordo com um intervalo de datas. Do jeito que tá, ele retorna sem filtar por alguma data.

    Obrigado

    segunda-feira, 16 de julho de 2012 14:15

Respostas

  • Sim, meu caro faça o seguinte:

    DECLARE @DataAbertura DATETIME = '2010-01-01'

    ;WITH DadosPvt AS ( SELECT Baixa, [Média], Alta, DataAbertura FROM (SELECT Prioridade, DataAbertura FROM tempdb.dbo.pvt) AS S PIVOT (COUNT(Prioridade)FOR Prioridade IN ([BAIXA], [MÉDIA], [ALTA])) AS Pvt ) SELECT * FROM DadosPvt WHEREDataAbertura BETWEEN @DataAbertura and @DataAbertura

    Tente isso!


    /* Se útil por favor classifique a resposta */

    • Marcado como Resposta Leonardo D'Amato segunda-feira, 16 de julho de 2012 16:22
    segunda-feira, 16 de julho de 2012 16:06

Todas as Respostas

  • Leonardo, bom dia!

    Muito boa sua solução, primeiramente parabéns pela construção do código. Bem, agora para a Data veja como você pode fazer.

    USE tempdb
    GO
    
    --	DROP TABLE Pvt
    
    CREATE TABLE Pvt
    (
        ID INT IDENTITY(1,1),
        Prioridade VARCHAR(10) NOT NULL,
        DataAbertura DATETIME DEFAULT GETDATE()
    )
    
    INSERT INTO tempdb.dbo.pvt  (Prioridade, DataAbertura)
    VALUES ('Baixa','2010-01-01'),('Baixa','2012-01-01'),('Média','2012-06-12'),('Média','2012-07-10'),('Alta','2011-01-22'),
    	   ('Alta','2012-02-23'),('Alta','2012-01-12')
    
    
    SELECT * 
    FROM tempdb.dbo.pvt 
    
    
    ;WITH DadosPvt AS 
    (
    SELECT Baixa, [Média], Alta, DataAbertura  
    FROM (SELECT Prioridade, DataAbertura FROM tempdb.dbo.pvt) AS S
    PIVOT 
    (COUNT(Prioridade)FOR Prioridade IN ([BAIXA], [MÉDIA], [ALTA])) AS Pvt 
    )
    SELECT * 
    FROM DadosPvt
    WHERE DataAbertura = '2012-01-01 00:00:00.000'

    Se tiver alguma dúvida por favor poste aqui.


    Se quiser mais informações sobre power pivot veja aqui no meu blog abs = http://luanmorenodba.wordpress.com/2012/03/25/como-utilizar-o-operador-pivot/


    /* Se útil por favor classifique a resposta */

    segunda-feira, 16 de julho de 2012 14:27
  • Obrigado, Luan. 

    Então cara, na verdade, eu já tenho essa data de abertura.

    Tenho um form em c# que insere dados na tabela solicitação
    No caso é ID_SOLICITACAO, DT_ABERTURA, PRIORIDADE

    Depois de inserido, eu preciso gerar um relatório no ReportViewer, com os dados que te passei, a contagem da coluna Prioridade, que só pode ter 3 valores (baixa, média, alta). Até aí, foi feito.

    Porém, isso que você me passou, eu consigo usar com variáveis? Pois o intervalo de datas será definido a partir de 2 DateTimePicker, ou seja, o usuario que definirá dinamicamente o intervalo.

    O dado da data já existe, ou seja, preciso fazzer algo assim: DT_ABERTURA BETWEEN @dtINICIO AND @dtFIM

    segunda-feira, 16 de julho de 2012 14:47
  • Sim, meu caro faça o seguinte:

    DECLARE @DataAbertura DATETIME = '2010-01-01'

    ;WITH DadosPvt AS ( SELECT Baixa, [Média], Alta, DataAbertura FROM (SELECT Prioridade, DataAbertura FROM tempdb.dbo.pvt) AS S PIVOT (COUNT(Prioridade)FOR Prioridade IN ([BAIXA], [MÉDIA], [ALTA])) AS Pvt ) SELECT * FROM DadosPvt WHEREDataAbertura BETWEEN @DataAbertura and @DataAbertura

    Tente isso!


    /* Se útil por favor classifique a resposta */

    • Marcado como Resposta Leonardo D'Amato segunda-feira, 16 de julho de 2012 16:22
    segunda-feira, 16 de julho de 2012 16:06
  • Consegui, Luan.

    Muito obrigado pela força, irmão!

    estou postando o resultado, que eu adaptei de acordo com minhas necessidades, afim de ajudar a mais pessoas que possam vir a precisar.

    DECLARE @DataAbertura DATETIME = '2012-07-01'
    DECLARE @DataFim DATETIME = '2012-07-31'
    
    ;WITH DadosPvt AS 
    (
    SELECT Baixa, [Média], Alta, DT_ABERTURA  
    FROM (SELECT Prioridade, DT_ABERTURA FROM SOLICITACAO) AS S
    PIVOT 
    (COUNT(Prioridade)FOR Prioridade IN ([BAIXA], [MÉDIA], [ALTA])) AS Pvt 
    )
    SELECT SUM(BAIXA), SUM(MÉDIA), SUM(ALTA)
    FROM DadosPvt
    WHERE DT_ABERTURA BETWEEN @DataAbertura and @DataFim

    Valeu mais uma vez, Luan.
    Abraço

    segunda-feira, 16 de julho de 2012 16:22
  • Luan,

    Vc sabe como aplico essa query corretamente numa procedure ou numa view? Pois preciso passar isso para um DataSet e jogar num relatório no ReportViewer, mas não estou conseguindo.

    Abraço

    segunda-feira, 16 de julho de 2012 17:00
  • Leonardo, boa tarde!

    Meu caro faça da seguinte forma

    CREATE PROCEDURE dbo.proc_ResultSetPvt
    	@DataAbertura DATETIME,
    	@DataFim DATETIME
    AS
    
    ;WITH DadosPvt AS 
    (
    SELECT Baixa, [Média], Alta, DataAbertura  
    FROM (SELECT Prioridade, DataAbertura FROM tempdb.dbo.pvt) AS S
    PIVOT 
    (COUNT(Prioridade)FOR Prioridade IN ([BAIXA], [MÉDIA], [ALTA])) AS Pvt 
    )
    SELECT SUM(BAIXA), SUM(MÉDIA), SUM(ALTA)
    FROM DadosPvt
    WHERE DataAbertura BETWEEN @DataAbertura and @DataFim
    
    
    
    EXECUTE proc_ResultSetPvt @DataAbertura = '2010-01-01',	
    						  @DataFim = '2012-01-01'

    Assim você conseguirá pegar o intervalo de tempo.

    Estamos aqui sempre para ajudar :)

    Obrigado pelo Feedback!


    /* Se útil por favor classifique a resposta */

    segunda-feira, 16 de julho de 2012 17:09
  • Valeu Luan, consegui!

    Não sei se é a sua área, mas quando eu crio uma VIEW, eu consigo popular um relatório no reportviewer, porém, quando é StoredProcedures ele não popula corretamente.

    Obrigado

    segunda-feira, 16 de julho de 2012 17:43