none
Agrupar resultado RRS feed

  • Pergunta

  • Estou fazendo um consulta no banco, e esta retornando o seguinte resultado

    Parachoque dianteiro | Ruim | Enferrujado
    Parachoque dianteiro | Ruim | Amassado
    Parachoque dianteiro | Ruim | Riscado
    Paralama dianteiro | LD Ruim | Enferrujado
    Paralama dianteiro | LD Ruim | Amassado
    Paralama dianteiro | LD Ruim | Riscado
    Paralama traseiro | LD Ruim | Enferrujado
    Paralama traseiro | LD Ruim | Amassado
    Paralama traseiro | LD Ruim | Riscado

    Tem como agrupar isso, por exemplo, deixar assim:

    Parachoque dianteiro    | Ruim    |   Enferrujado - Amassado - Riscado

    sexta-feira, 2 de junho de 2017 19:09

Respostas

  • Experimente fazer uns testes dessa forma:

    with CTE_Orig as
    (
        SELECT nomeItem AS Item, ISNULL(nomeNota, 'Não Avaliado') AS Nota, ISNULL(nomeNotaSub, '') AS 'Sub Nota' 
        FROM Finder_VistoriaResultado 
        INNER JOIN Finder_Veiculo ON Finder_Veiculo.idVeiculo = Finder_VistoriaResultado.idVeiculo
        INNER JOIN Finder_Item ON Finder_VistoriaResultado.idItem = Finder_Item.idItem
        LEFT JOIN Finder_Nota ON Finder_VistoriaResultado.idNota = Finder_Nota.idNota
        LEFT JOIN Finder_NotaSub ON Finder_VistoriaResultado.idNotaSub = Finder_NotaSub.idNotaSub
        INNER JOIN Finder_VeiculoStatus ON Finder_VeiculoStatus.idVeiculo = Finder_Veiculo.idVeiculo
        WHERE Finder_Veiculo.idVeiculo = @idVeiculo AND Finder_VeiculoStatus.inativoVeiculoStatus = 0
    )
    
    select
        c.Item,
        c.Nota,
        STUFF( (SELECT ' - ' + s.[Sub Nota]
                FROM CTE_Orig as s
                WHERE s.Item = c.Item and s.Nota = c.Nota
                FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
               ,1, 3, '') AS 'Sub Nota'     
    from CTE_Orig as c
    group by
        c.Item,
        c.Nota

    obs: não conheço a estrutura das suas tabelas, talvez seja possível montar a query sem CTE, mas pelo que presumi a CTE me pareceu necessária

    Espero que ajude


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


    • Editado gapimex sexta-feira, 2 de junho de 2017 20:00
    • Marcado como Resposta JulioSonic sexta-feira, 2 de junho de 2017 20:52
    sexta-feira, 2 de junho de 2017 19:59

Todas as Respostas

  • Boa tarde,

    Julio, você pode postar a query que retorna o primeiro resultado para verificarmos as alterações necessárias?


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

    sexta-feira, 2 de junho de 2017 19:15
  • Boa tarde gapimex, claro, segue ela..

    SELECT nomeItem AS Item, ISNULL(nomeNota, 'Não Avaliado') AS Nota, ISNULL(nomeNotaSub, '') AS 'Sub Nota' FROM Finder_VistoriaResultado 
    INNER JOIN Finder_Veiculo ON Finder_Veiculo.idVeiculo = Finder_VistoriaResultado.idVeiculo
    INNER JOIN Finder_Item ON Finder_VistoriaResultado.idItem = Finder_Item.idItem
    LEFT JOIN Finder_Nota ON Finder_VistoriaResultado.idNota = Finder_Nota.idNota
    LEFT JOIN Finder_NotaSub ON Finder_VistoriaResultado.idNotaSub = Finder_NotaSub.idNotaSub
    INNER JOIN Finder_VeiculoStatus ON Finder_VeiculoStatus.idVeiculo = Finder_Veiculo.idVeiculo
    WHERE Finder_Veiculo.idVeiculo = @idVeiculo AND Finder_VeiculoStatus.inativoVeiculoStatus = 0

    sexta-feira, 2 de junho de 2017 19:25
  • A coluna a agrupar é a nomeNotaSub? Ela pertence a qual tabela? Finder_NotaSub?

    Qual versão do SQL Server você está utilizando?


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

    sexta-feira, 2 de junho de 2017 19:42
  • É isso mesmo.. 

    idItem      Item                                               Nota                                               Sub Nota
    ----------- -------------------------------------------------- -------------------------------------------------- -------------------------
    5           Parachoque dianteiro                               Ruim                                               Enferrujado
    5           Parachoque dianteiro                               Ruim                                               Amassado
    5           Parachoque dianteiro                               Ruim                                               Riscado

    -------

    Estou usando o 2008

    sexta-feira, 2 de junho de 2017 19:52
  • Experimente fazer uns testes dessa forma:

    with CTE_Orig as
    (
        SELECT nomeItem AS Item, ISNULL(nomeNota, 'Não Avaliado') AS Nota, ISNULL(nomeNotaSub, '') AS 'Sub Nota' 
        FROM Finder_VistoriaResultado 
        INNER JOIN Finder_Veiculo ON Finder_Veiculo.idVeiculo = Finder_VistoriaResultado.idVeiculo
        INNER JOIN Finder_Item ON Finder_VistoriaResultado.idItem = Finder_Item.idItem
        LEFT JOIN Finder_Nota ON Finder_VistoriaResultado.idNota = Finder_Nota.idNota
        LEFT JOIN Finder_NotaSub ON Finder_VistoriaResultado.idNotaSub = Finder_NotaSub.idNotaSub
        INNER JOIN Finder_VeiculoStatus ON Finder_VeiculoStatus.idVeiculo = Finder_Veiculo.idVeiculo
        WHERE Finder_Veiculo.idVeiculo = @idVeiculo AND Finder_VeiculoStatus.inativoVeiculoStatus = 0
    )
    
    select
        c.Item,
        c.Nota,
        STUFF( (SELECT ' - ' + s.[Sub Nota]
                FROM CTE_Orig as s
                WHERE s.Item = c.Item and s.Nota = c.Nota
                FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
               ,1, 3, '') AS 'Sub Nota'     
    from CTE_Orig as c
    group by
        c.Item,
        c.Nota

    obs: não conheço a estrutura das suas tabelas, talvez seja possível montar a query sem CTE, mas pelo que presumi a CTE me pareceu necessária

    Espero que ajude


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


    • Editado gapimex sexta-feira, 2 de junho de 2017 20:00
    • Marcado como Resposta JulioSonic sexta-feira, 2 de junho de 2017 20:52
    sexta-feira, 2 de junho de 2017 19:59
  • Deleted
    sexta-feira, 2 de junho de 2017 20:19
  • Experimente fazer uns testes dessa forma:

    with CTE_Orig as
    (
        SELECT nomeItem AS Item, ISNULL(nomeNota, 'Não Avaliado') AS Nota, ISNULL(nomeNotaSub, '') AS 'Sub Nota' 
        FROM Finder_VistoriaResultado 
        INNER JOIN Finder_Veiculo ON Finder_Veiculo.idVeiculo = Finder_VistoriaResultado.idVeiculo
        INNER JOIN Finder_Item ON Finder_VistoriaResultado.idItem = Finder_Item.idItem
        LEFT JOIN Finder_Nota ON Finder_VistoriaResultado.idNota = Finder_Nota.idNota
        LEFT JOIN Finder_NotaSub ON Finder_VistoriaResultado.idNotaSub = Finder_NotaSub.idNotaSub
        INNER JOIN Finder_VeiculoStatus ON Finder_VeiculoStatus.idVeiculo = Finder_Veiculo.idVeiculo
        WHERE Finder_Veiculo.idVeiculo = @idVeiculo AND Finder_VeiculoStatus.inativoVeiculoStatus = 0
    )
    
    select
        c.Item,
        c.Nota,
        STUFF( (SELECT ' - ' + s.[Sub Nota]
                FROM CTE_Orig as s
                WHERE s.Item = c.Item and s.Nota = c.Nota
                FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
               ,1, 3, '') AS 'Sub Nota'     
    from CTE_Orig as c
    group by
        c.Item,
        c.Nota

    obs: não conheço a estrutura das suas tabelas, talvez seja possível montar a query sem CTE, mas pelo que presumi a CTE me pareceu necessária

    Espero que ajude


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


    Funcionou, era isso mesmo. Muitos comandos ai eu não conhecia ainda, tipo esse CTE esse STUFF.. Vou dar uma estuda nisso ai..

    Muito obrigado pela ajuda.

    sexta-feira, 2 de junho de 2017 20:52
  • O agrupamento deve ser por veículo/item ou por item (independente de veículo)?


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    É por item apenas. O ID do veiculo vai no Where
    sexta-feira, 2 de junho de 2017 23:02