Usuário com melhor resposta
PIVOT + WHERE

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
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
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 */
-
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, PRIORIDADEDepois 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
-
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
-
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 -
-
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 */
-