none
select aninhado RRS feed

  • 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

    terça-feira, 13 de maio de 2014 17:23

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
    terça-feira, 13 de maio de 2014 17:35

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
    terça-feira, 13 de maio de 2014 17:35
  • 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]

    terça-feira, 13 de maio de 2014 18:10
  • Gapimex nao deu certo como vc me mandou ele trás mais de uma linha para a mesma data e não é isso que eu quero.



    Junior

    terça-feira, 13 de maio de 2014 19:56
  • Junior eu não posso gerar outra tabela, na realidade esse select estou colocando dentro de um dataset que por sua vez alimenta um report viewer.

    O dataset não aceita pivot, sei que com pivot monta exatamente do jeito que eu quero.


    Junior

    terça-feira, 13 de maio de 2014 19:57
  • 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

    terça-feira, 13 de maio de 2014 20:17
  • 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

    quarta-feira, 14 de maio de 2014 11:22
  • 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

    quarta-feira, 14 de maio de 2014 11:35
  • Junior, você por acaso adicionou a coluna Status no Group By? Se adicionou experimente remove-la.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 14 de maio de 2014 13:06
  • Realmente era isso agora deu certo.

    Junior

    quarta-feira, 14 de maio de 2014 13:56