none
AGRUPAMENTO DE VARIOS REGISTROS EM UMA SUBCONSULTA RRS feed

  • Pergunta

  • Pessoal, tenho 2 tabelas... uma com a peça e outra com os carros compartível com aquela peça.

    Então para cada peça... pode existir de 1 até 10 carros compartíveis

    Então preciso unir as duas tabelas e para cada peça ter suas 'compartibilidades'
    porem se 1 peça tiver 10 compartibilidade (10 registros)... vão parecer 10 peças repetidas....

    Hoje está assim:

    Descrição           Compatibilidade
    Amortecedor       Fiat Uno 2009
    Amortecedor       Fiat Siena 2010
    Amortecedor       Fiat strada 2008

    e queria que aparecesse assim:

    Descrição           Compatibilidade
    Amortecedor       Fiat Uno 2009 / Fiat Siena 2010 / Fiat strada 2008

    Fiz assim:
    SELECT  produtos.CODIGO AS var_cod, produtos.DESCRICAO AS var_desc, produtos.FABRICANTE AS var_fab, produtos.QUANT_ESTOQUE AS var_quant,
                  (SELECT TOP (1) VALOR_VV FROM Produtos_Precos WHERE (COD_PRODUTO = produtos.CODIGO) ORDER BY CODIGO DESC) AS venda, Produtos_Comp.MODELO, Produtos_Comp.ANO
    FROM produtos INNER JOIN Produtos_Comp ON produtos.CODIGO = Produtos_Comp.COD_PRODUTO
    WHERE     (produtos.ATIVO = 1)
    ORDER BY var_desc


    e tentei tambem
    SELECT     CODIGO AS var_cod, DESCRICAO AS var_desc, FABRICANTE AS var_fab, QUANT_ESTOQUE AS var_quant,
                              (SELECT     TOP (1) VALOR_VV
                                FROM          Produtos_Precos
                                WHERE      (COD_PRODUTO = produtos.CODIGO)
                                ORDER BY CODIGO DESC) AS venda,
                              (SELECT     COD_PRODUTO, MODELO, ANO
                                FROM          Produtos_Comp
                                WHERE      (COD_PRODUTO = produtos.CODIGO)) AS Compartibilidade
    FROM         produtos
    WHERE     (ATIVO = 1)
    ORDER BY var_desc
    sábado, 26 de dezembro de 2020 11:00

Todas as Respostas

  • Bom dia,

    A partir do SQL Server 2017 você pode utilizar a função de agregação String_Agg:

    SELECT  
      produtos.CODIGO AS var_cod, 
      produtos.DESCRICAO AS var_desc, 
      produtos.FABRICANTE AS var_fab, 
      produtos.QUANT_ESTOQUE AS var_quant,
      (SELECT TOP (1) VALOR_VV FROM Produtos_Precos 
       WHERE COD_PRODUTO = produtos.CODIGO
       ORDER BY CODIGO DESC) AS venda, 
      string_agg
        (Produtos_Comp.MODELO + ' ' + cast(Produtos_Comp.ANO as char(4)), 
         ' / ') as Compatibilidade
    FROM produtos 
    INNER JOIN Produtos_Comp ON produtos.CODIGO = Produtos_Comp.COD_PRODUTO
    WHERE 
      produtos.ATIVO = 1
    GROUP BY
      produtos.CODIGO, 
      produtos.DESCRICAO, 
      produtos.FABRICANTE, 
      produtos.QUANT_ESTOQUE
    ORDER BY 
      var_desc

    Espero que ajude


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

    sábado, 26 de dezembro de 2020 14:16
  • tem alguma solução para SQL Server 2008?
    sábado, 26 de dezembro de 2020 15:01
  • Uma alternativa para o SQL Server 2008 é utilizar XML:

    SELECT  
      produtos.CODIGO AS var_cod, 
      produtos.DESCRICAO AS var_desc, 
      produtos.FABRICANTE AS var_fab, 
      produtos.QUANT_ESTOQUE AS var_quant,
      (SELECT TOP (1) VALOR_VV FROM Produtos_Precos 
       WHERE COD_PRODUTO = produtos.CODIGO
       ORDER BY CODIGO DESC) AS venda,
      STUFF
        ( (SELECT ' / ' + Produtos_Comp.MODELO + ' ' + cast(Produtos_Comp.ANO as char(4))
           FROM Produtos_Comp
           WHERE produtos.CODIGO = Produtos_Comp.COD_PRODUTO
           FOR XML PATH(''), TYPE).value('.', 'varchar(max)') , 1, 3, '') as Compatibilidade
    FROM produtos  
    WHERE 
      produtos.ATIVO = 1
    ORDER BY 
      var_desc

    Espero que ajude


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

    sábado, 26 de dezembro de 2020 17:04

  • Amigo Deu erro

    sábado, 26 de dezembro de 2020 23:58
  • Qual mensagem de erro foi exibida?

    Vc fez o teste através do SQL Server Management Studio?

    Fez alguma alteração na consulta sugerida?


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

    domingo, 27 de dezembro de 2020 12:07

  • Amigo Deu erro

    WEBIERONLINE,

    Poderia nos dizer qual é a mensagem de erro.

    Se for possível compartilhar as alterações realizadas em sua query, pode nos ajudar a entender melhor o seu problema.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    domingo, 27 de dezembro de 2020 13:18
  • Qual mensagem de erro foi exibida?

    Vc fez o teste através do SQL Server Management Studio?

    Fez alguma alteração na consulta sugerida?


    Não... somente copiei e colei
    segunda-feira, 28 de dezembro de 2020 19:12

  • Amigo Deu erro

    WEBIERONLINE,

    Poderia nos dizer qual é a mensagem de erro.

    Se for possível compartilhar as alterações realizadas em sua query, pode nos ajudar a entender melhor o seu problema.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    Deu a seguinte msg de erro:

    Instrução SQL executada: SELECT produtos.CODIGO AS var_cod, produtos.DESCRICAO AS var_desc, produtos.FABRICANTE AS var_fab, produtos.QUANT_ESTOQUE AS var_quant, (SELECT TOP (1) VALOR_VV FROM Produtos_Precos WHERE COD_PRODUTO = produtos.CODIGO ORDER BY CODIGO DESC) AS venda, ... Origem do Erro: .Net Sq1Client Data Provider Mensagem de Erro: Falha em SELECT porque as seguintes opções SET têm configurações incorreta 'ARITHABORT'. Verifique se as opções SET estão corretas para uso com exibições indexadas e/ou índices em colunas computadas e/ou índices filtrados e/ou notificações de consulta e/ou métodos de tipo de dados XML e/ou operações de índice espacial. 

    segunda-feira, 28 de dezembro de 2020 19:12
  • Você pode tentar executar a consulta no SQL Server Management Studio e depois postar a mensagem de erro aqui?

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

    terça-feira, 29 de dezembro de 2020 13:15
  • Você pode tentar executar a consulta no SQL Server Management Studio e depois postar a mensagem de erro aqui?


    Bom Dia Amigo,

    Foi o que fiz acima!

    terça-feira, 29 de dezembro de 2020 14:43
  • Bom dia,

    Normalmente a mensagem de erro no SSMS costuma conter um código de erro, mas tente acrescentar a linha abaixo antes da consulta:

    SET ARITHABORT ON; 

    Espero que ajude


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

    terça-feira, 29 de dezembro de 2020 14:55
  • Bom dia,

    Normalmente a mensagem de erro no SSMS costuma conter um código de erro, mas tente acrescentar a linha abaixo antes da consulta:

    SET ARITHABORT ON; 

    Espero que ajude

    Fiz assim:

    SET ARITHABORT ON; 

    SELECT  
      produtos.CODIGO AS var_cod, 
      produtos.DESCRICAO AS var_desc, 
      produtos.FABRICANTE AS var_fab, 
      produtos.QUANT_ESTOQUE AS var_quant,
      (SELECT TOP (1) VALOR_VV FROM Produtos_Precos 
       WHERE COD_PRODUTO = produtos.CODIGO
       ORDER BY CODIGO DESC) AS venda,
      STUFF
        ( (SELECT ' / ' + Produtos_Comp.MODELO + ' ' + cast(Produtos_Comp.ANO as char(4))
           FROM Produtos_Comp
           WHERE produtos.CODIGO = Produtos_Comp.COD_PRODUTO
           FOR XML PATH(''), TYPE).value('.', 'varchar(max)') , 1, 3, '') as Compatibilidade
    FROM produtos  
    WHERE 
      produtos.ATIVO = 1
    ORDER BY 
      var_desc

    E deu certo!!!! 

    Uma duvida surgiu:

    Fiz dentro do SSMS... e como usaria o SET ARITHABORT ON; dentro da minha linha de código no vb6?


    terça-feira, 29 de dezembro de 2020 16:08
  • Não tenho experiência com o VB, mas a primeira tentativa seria adicionar o Set antes da consulta deixando os 2 juntos. Se não funcionar, tenta executar só o Set separadamente imediatamente antes da consulta.

    Espero que ajude


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

    terça-feira, 29 de dezembro de 2020 17:12
  • Bom dia,

    Normalmente a mensagem de erro no SSMS costuma conter um código de erro, mas tente acrescentar a linha abaixo antes da consulta:

    SET ARITHABORT ON; 

    Espero que ajude

    Fiz assim:

    SET ARITHABORT ON; 

    SELECT  
      produtos.CODIGO AS var_cod, 
      produtos.DESCRICAO AS var_desc, 
      produtos.FABRICANTE AS var_fab, 
      produtos.QUANT_ESTOQUE AS var_quant,
      (SELECT TOP (1) VALOR_VV FROM Produtos_Precos 
       WHERE COD_PRODUTO = produtos.CODIGO
       ORDER BY CODIGO DESC) AS venda,
      STUFF
        ( (SELECT ' / ' + Produtos_Comp.MODELO + ' ' + cast(Produtos_Comp.ANO as char(4))
           FROM Produtos_Comp
           WHERE produtos.CODIGO = Produtos_Comp.COD_PRODUTO
           FOR XML PATH(''), TYPE).value('.', 'varchar(max)') , 1, 3, '') as Compatibilidade
    FROM produtos  
    WHERE 
      produtos.ATIVO = 1
    ORDER BY 
      var_desc

    E deu certo!!!! 

    Uma duvida surgiu:

    Fiz dentro do SSMS... e como usaria o SET ARITHABORT ON; dentro da minha linha de código no vb6?


    WEBIERONLINE,

    Faz muito tempo que não trabalho com VB ou linguagens similares como por exemplo Delphi, mas quando eu trabalhei com Delphi, dentro do componente que eu utilizava especificamente para executar os comandos Transact-SQL, as diretivas Set também eram processadas pelo mesmo, mas sendo declaradas em linhas de código separadas.

    Neste caso, recomendo você tentar diretamente no componente que vai executar este Select a declaração do diretiva Set em linhas declaradas separadamente, de preferência não utilize o sinal de ;


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 31 de dezembro de 2020 12:00