Usuário com melhor resposta
select aninhado

Pergunta
-
Tenho um select assim :
select b.status,count(b.id) as qtd,b.data from tabela group by b.status,b.data
o result é assim :
status qtd data
N 10 2014-01-01
S 20 2014-01-01
Sendo que preciso que venha assim o result
status1 qtd1 status2 qtd2 data
N 10 S 20 2014-01-01
Como posso fazer isso sem usar pivot.
Junior
Respostas
-
Boa tarde,
Junior_luiz, se os valores possíveis para a coluna Status são apenas 'N' e 'S' experimente dessa forma:
select 'N' as status1, count(case when b.status = 'N' then b.id end) as qtd1, 'S' as status2, count(case when b.status = 'S' then b.id end) as qtd2, b.data from tabela as b group by b.data
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Junior_luiz quarta-feira, 14 de maio de 2014 13:57
Todas as Respostas
-
Boa tarde,
Junior_luiz, se os valores possíveis para a coluna Status são apenas 'N' e 'S' experimente dessa forma:
select 'N' as status1, count(case when b.status = 'N' then b.id end) as qtd1, 'S' as status2, count(case when b.status = 'S' then b.id end) as qtd2, b.data from tabela as b group by b.data
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Junior_luiz quarta-feira, 14 de maio de 2014 13:57
-
Junior,
Você esta querendo sumarizar todos os dados em uma única linha.
Particularmente eu acredito que o Pivot não se aplica de forma natural a sua necessidade.
Neste caso, temos que desnormalizar esta estrutura tendo uma tabela maior na sua quantidade de colunas, mas com uma relação menor de registros.
Veja se isto ajuda:
Declare @Tabela Table (Codigo Int Primary Key Identity(1,1), Status Char(1), Quantidade Int, Data Date Default GetDate()) Insert Into @Tabela (Status, Quantidade) Values ('N',10),('S',20) Insert Into @Tabela (Status, Quantidade) Values ('N',20),('S',40) Insert Into @Tabela (Status, Quantidade) Values ('N',30),('S',60) Insert Into @Tabela (Status, Quantidade) Values ('N',40),('S',80) Insert Into @Tabela (Status, Quantidade) Values ('N',50),('S',100) Insert Into @Tabela (Status, Quantidade) Values ('N',60),('S',120) Insert Into @Tabela (Status, Quantidade) Values ('N',70),('S',140) Insert Into @Tabela (Status, Quantidade) Values ('N',80),('S',160) Insert Into @Tabela (Status, Quantidade) Values ('N',90),('S',180) Declare @Registros Table (Codigo Int Primary Key Identity(1,1), ValoresAcumulados Varchar(Max)) Declare @Valores Varchar(Max), @Contador Int Set @Contador = 1 While @Contador <= (Select Count(Codigo) From @Tabela) Begin Set @Valores = (Select Status +' '+ Convert(Varchar(10),Quantidade) +' '+ Convert(Varchar(10),Data) + '' From @Tabela Where Codigo = @Contador) If @Contador = 1 Insert @Registros Values (@Valores) Else Begin Update @Registros Set ValoresAcumulados = ValoresAcumulados + @Valores End Set @Contador += 1 End Select ValoresAcumulados from @Registros
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
-
-
-
Não entendi porque a query retornou uma linha para cada data... A coluna data é do tipo Date?
Experimente fazer um teste com o script abaixo:
declare @Tabela table (id int identity(1, 1), status char(1), data date); insert into @Tabela values ('N', '2014-01-01'), ('N', '2014-01-01'), ('N', '2014-01-01'), ('N', '2014-01-01'), ('N', '2014-01-01'), ('N', '2014-01-01'), ('N', '2014-01-01'), ('N', '2014-01-01'), ('N', '2014-01-01'), ('N', '2014-01-01'), ('N', '2014-01-02'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-01'), ('S', '2014-01-02'), ('S', '2014-01-02'); select 'N' as status1, count(case when b.status = 'N' then b.id end) as qtd1, 'S' as status2, count(case when b.status = 'S' then b.id end) as qtd2, b.data from @tabela as b group by b.data
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Gapimex meu select é assim :
SELECT data_processamento,COUNT(id) AS qtd,status from auditoria a, Empresa e where e.cdempr = a.id and e.cdempr = 2 and a.data_processamento BETWEEN '2014-05-09' AND '2014-05-11' group by a.data_processamento,a.status ORDER BY a.data_processamento,a.status
O que fiz foi somente alterar seu select o group by e order by eu mantive o meu.
Junior
-
o teu select apresenta isso como result
status1 qtd1 status2 qtd2 data N 99 S 0 2014-05-09 00:00:00.000 N 0 S 18 2014-05-09 00:00:00.000 N 6865 S 0 2014-05-10 00:00:00.000 N 0 S 1098 2014-05-10 00:00:00.000 N 5932 S 0 2014-05-11 00:00:00.000 N 0 S 1061 2014-05-11 00:00:00.000
e quero o result assim
status1 qtd1 status2 qtd2 N 99 S 18 2014-05-09 00:00:00.000 N 6865 S 1098 2014-05-10 00:00:00.000 N 5932 S 1061 2014-05-11 00:00:00.000
Junior
-
Junior, você por acaso adicionou a coluna Status no Group By? Se adicionou experimente remove-la.
Assinatura: http://www.imoveisemexposicao.com.br
-