none
Dúvida Sql RRS feed

  • Pergunta

  • Tenho a seguinte query abaixo:

      select Func.apelido, C.codigo,C.observacao,C.desconto, S.servico,I.item,C.valor 
      from tbl_ComandaServico C
      inner join    tbl_Servico  S
      on  C.codigo_servico  = S.codigo
      inner join tbl_Item I
      on C.codigo_item = I.codigo
      inner join tbl_AjudanteServico AJ
      on Aj.Codigo_Comanda = C.codigo_comanda_aberta 
      inner join tbl_Funcionario Func
      on Aj.codigo_ajudante  = Func.codigo
      where C.codigo_comanda_aberta = 50811

    Que resulta no seguinte:

    Existe a possibilidade de nao duplicar apenas juntar os apelidos por virgula ou algo do gênero trazer tudo em uma unica linha ? muito obrigado


    segunda-feira, 7 de novembro de 2016 17:32

Respostas

  • WITH T AS
    (
    SELECT
    Func.Apelido
    , C.codigo
    , C.observacao
    , C.desconto
    , S.servico
    , I.item
    , C.valor 
    
    FROM tbl_ComandaServico C
    
    JOIN tbl_Servico  S  on  C.codigo_servico  = S.codigo
    JOIN tbl_Item I on C.codigo_item = I.codigo
    JOIN tbl_AjudanteServico AJ on Aj.Codigo_Comanda = C.codigo_comanda_aberta 
    JOIN tbl_Funcionario Func on Aj.codigo_ajudante  = Func.codigo
    
    WHERE
     C.codigo_comanda_aberta = 50811
    )
    
    SELECT
      STUFF((SELECT ', ' + CAST(Apelido AS VARCHAR(10))       [text()]
             FROM T 
             WHERE Codigo = t.Codigo
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido,
    T.Codigo ,
    T.Observavao ,
    T.Desconto ,
    T.Servico ,
    T.Item ,
    T.Valor
    FROM T
    
    GROUP BY 
    T.Codigo ,
    T.Observavao ,
    T.Desconto ,
    T.Servico ,
    T.Item ,
    T.Valor


    • Editado Sergio Marchetti segunda-feira, 7 de novembro de 2016 19:53
    • Marcado como Resposta _Manigold_ segunda-feira, 7 de novembro de 2016 19:58
    segunda-feira, 7 de novembro de 2016 19:53
  • Ola amigo, quero unificar somente  os nomes, concatenar no caso, o resto fica padrao, deixar tudo em uma unica linha.

    1)query 1

                 

    --Criei uma tabela temporária com os dados de demostração 
    --na sua SP 
    IF ( OBJECT_ID('TEMPDB..#Dados') IS NOT NULL )
        DROP TABLE #Dados;

    CREATE TABLE #Dados
        (
          Apelido VARCHAR(max),
     Codigo VARCHAR(max),
     Observavao varchar(max),
     Desconto DECIMAL(18,2),
    Servico varchar(max),
    Item varchar(max),
    Valor DECIMAL(18,2)


        );

     INSERT INTO #Dados
             ( Apelido ,
               Codigo ,
               Observavao ,
               Desconto ,
               Servico ,
               Item ,
               Valor
             )
     VALUES  ( 'ZE' , -- Apelido - varchar(max)
               '71273' , -- Codigo - varchar(max)
               '' , -- Observavao - varchar(max)
               0 , -- Desconto - decimal
               'Alisamento' , -- Servico - varchar(max)
               'A partir de' , -- Item - varchar(max)
               150  -- Valor - decimal
             ),
       ( 'ALE' , -- Apelido - varchar(max)
               '71273' , -- Codigo - varchar(max)
               '' , -- Observavao - varchar(max)
               0 , -- Desconto - decimal
               'Alisamento' , -- Servico - varchar(max)
               'A partir de' , -- Item - varchar(max)
               150  -- Valor - decimal
             )



    SELECT
      STUFF((SELECT ', ' + CAST(T.Apelido AS VARCHAR(10))       [text()]
             FROM #Dados T 
             WHERE T.Codigo = t.Codigo
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido,
     C.Codigo ,
     C.Observavao ,
     C.Desconto ,
     C.Servico ,
     C.Item ,
     C.Valor
    FROM #Dados AS C

    --Query 2

    SELECT DISTINCT
      STUFF((SELECT ', ' + CAST(T.Apelido AS VARCHAR(10))       [text()]
             FROM #Dados T 
             WHERE T.Codigo = t.Codigo
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido,
     C.Codigo ,
     C.Observavao ,
     C.Desconto ,
     C.Servico ,
     C.Item ,
     C.Valor
    FROM #Dados AS C
    

    veja o resultado , pelo que eu entendi e isso ?? se for basta adequar o codigo no seu SELECT


    Wesley Neves

    • Marcado como Resposta _Manigold_ segunda-feira, 7 de novembro de 2016 20:05
    segunda-feira, 7 de novembro de 2016 19:27
  • Mais uma tentativa então com CTE ao invés de tabela temporária:

    WITH T AS
    (
    SELECT
    Func.Apelido
    , C.codigo
    , C.observacao
    , C.desconto
    , S.servico
    , I.item
    , C.valor 
    
    FROM tbl_ComandaServico C
    
    JOIN tbl_Servico  S  on  C.codigo_servico  = S.codigo
    JOIN tbl_Item I on C.codigo_item = I.codigo
    JOIN tbl_AjudanteServico AJ on Aj.Codigo_Comanda = C.codigo_comanda_aberta 
    JOIN tbl_Funcionario Func on Aj.codigo_ajudante  = Func.codigo
    
    WHERE
     C.codigo_comanda_aberta = 50811
    )
    
    SELECT
      STUFF((SELECT ', ' + CAST(Apelido AS VARCHAR(10))       [text()]
             FROM T 
             WHERE Codigo = t.Codigo
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido,
     C.Codigo ,
     C.Observavao ,
     C.Desconto ,
     C.Servico ,
     C.Item ,
     C.Valor
    FROM T
    
    GROUP BY 
    C.Codigo ,
     C.Observavao ,
     C.Desconto ,
     C.Servico ,
     C.Item ,
     C.Valor


    • Editado Sergio Marchetti segunda-feira, 7 de novembro de 2016 19:46
    • Marcado como Resposta _Manigold_ segunda-feira, 7 de novembro de 2016 20:05
    segunda-feira, 7 de novembro de 2016 19:44

Todas as Respostas

  • Olá _Manigold_

    Você pode usar a função STUFF para trazer a coluna apelido separada por virgulas

    SELECT 
           STUFF((SELECT ', ' + CAST(Apelido AS VARCHAR(10))       [text()]
             FROM tbl_Funcionario 
             WHERE ID = t.ID
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido
    
            ,C.Codigo, C.Observacao, C.Desconto, etc...
    
    FROM tbl_ComandaServico C
    
    JOIN etc...
    
    GROUP BY
    
    C.Codigo, C.Observacao, C.Desconto, etc...

    segunda-feira, 7 de novembro de 2016 17:43
  • tenta isso:

    SELECT
      (SELECT (COALESCE(Func.apelido, '') + ',')
       FROM tbl_Funcionario AS F2
       WHERE Func.apelido = F2.apelido
       FOR XML PATH('')) AS 'apelidos',
      C.codigo,
      C.observacao,
      C.desconto,
      S.servico,
      I.item,
      C.valor 
    FROM
      tbl_ComandaServico AS C
      INNER JOIN tbl_Servico AS S ON C.codigo_servico = S.codigo
      INNER JOIN tbl_Item AS I ON C.codigo_item = I.codigo
      INNER JOIN tbl_AjudanteServico AS AJ ON Aj.Codigo_Comanda = C.codigo_comanda_aberta 
      INNER JOIN tbl_Funcionario AS Func ON Aj.codigo_ajudante  = Func.codigo
    WHERE
      C.codigo_comanda_aberta = 50811

    segunda-feira, 7 de novembro de 2016 17:44
  • Algo Assim te ajuda

    --Criei uma tabela temporária com os dados de demostração 
    --na sua SP 
    IF ( OBJECT_ID('TEMPDB..#Dados') IS NOT NULL )
        DROP TABLE #Dados;	
    
    CREATE TABLE #Dados
        (
          Apelido VARCHAR(max),
    	  Codigo VARCHAR(max),
    	  Observavao varchar(max),
    	  Desconto DECIMAL(18,2),
    	 Servico varchar(max),
    	 Item varchar(max),
    	 Valor DECIMAL(18,2)
          
          
        );
     
     INSERT INTO #Dados
             ( Apelido ,
               Codigo ,
               Observavao ,
               Desconto ,
               Servico ,
               Item ,
               Valor
             )
     VALUES  ( 'ZE' , -- Apelido - varchar(max)
               '71273' , -- Codigo - varchar(max)
               '' , -- Observavao - varchar(max)
               0 , -- Desconto - decimal
               'Alisamento' , -- Servico - varchar(max)
               'A partir de' , -- Item - varchar(max)
               150  -- Valor - decimal
             ),
    		    ( 'ALE' , -- Apelido - varchar(max)
               '71273' , -- Codigo - varchar(max)
               '' , -- Observavao - varchar(max)
               0 , -- Desconto - decimal
               'Alisamento' , -- Servico - varchar(max)
               'A partir de' , -- Item - varchar(max)
               150  -- Valor - decimal
             )
    
    
     SELECT SUBSTRING(( SELECT  '|' + CONCAT(P.Apelido,SPACE(1),P.Codigo,SPACE(1),P.Observavao,SPACE(1),P.Desconto,SPACE(1),P.Servico,SPACE(1),P.Item,SPACE(1),P.Valor,SPACE(3)) AS [text()] 
                        FROM    #Dados P
                       
                      FOR
                        XML PATH('')
                      ), 2, 10000) AS 'Dados'


    Wesley Neves

    segunda-feira, 7 de novembro de 2016 17:47
  • Ola amigo, quero unificar somente  os nomes, concatenar no caso, o resto fica padrao, deixar tudo em uma unica linha.

    Muito obrigado


    • Editado _Manigold_ segunda-feira, 7 de novembro de 2016 18:04
    segunda-feira, 7 de novembro de 2016 18:03
  • Ola amigo, quero unificar somente  os nomes, concatenar no caso, o resto fica padrao, deixar tudo em uma unica linha.

    Muito obrigado


    • Editado _Manigold_ segunda-feira, 7 de novembro de 2016 18:04
    segunda-feira, 7 de novembro de 2016 18:03
  • Olá Wesley infelizmente não posso usar tabela temporária, são regras, tem que ser em um select mesmo.

    Muito obrigado a todos.

    segunda-feira, 7 de novembro de 2016 18:05
  • Olá amigo,

    este código que te passei faz justamente isso. Concatena e separa por vírgulas apenas o campo "Apelido".

    É só implementar seu código dentro deste modelo.

    SELECT 
           STUFF((SELECT ', ' + CAST(Apelido AS VARCHAR(10))       [text()]
             FROM tbl_Funcionario 
             WHERE ID = t.ID
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido
    
            ,C.Codigo, C.Observacao, C.Desconto, etc...
    
    FROM tbl_ComandaServico C
    
    JOIN etc...
    
    GROUP BY
    
    C.Codigo, C.Observacao, C.Desconto, etc...

    Atenciosamente,

    segunda-feira, 7 de novembro de 2016 18:09
  • Olá Sergio estou tentando, como não conhecia esse "STUFF"estou apanhando um pouco.
    segunda-feira, 7 de novembro de 2016 18:16
  • Vixi Sergio, estou apanhando mais que mulher de malandro kkkkkkkkkkkkkk.
    segunda-feira, 7 de novembro de 2016 18:47
  • Olá _Manigold_

    Me diga qual é sua dúvida que tento te ajudar!

    Sugiro que você faça primeiro sem o STUFF, depois aplicamos o STUFF somente no apelido. Com base no seu código lá na sua pergunta, veja se isso funciona:

    SELECT
     STUFF((SELECT ',' + apelido
            FROM tbl_Funcionario f
            WHERE codigo = Aj.codigo_ajudante
            FOR XML PATH('')), 1, 1, '') AS Apelido
    , C.codigo
    , C.observacao
    , C.desconto
    , S.servico
    , I.item
    , C.valor 
    
    FROM tbl_ComandaServico C
    
    JOIN tbl_Servico  S  on  C.codigo_servico  = S.codigo
    JOIN tbl_Item I on C.codigo_item = I.codigo
    JOIN tbl_AjudanteServico AJ on Aj.Codigo_Comanda = C.codigo_comanda_aberta 
    JOIN tbl_Funcionario Func on Aj.codigo_ajudante  = Func.codigo
    
    WHERE
     C.codigo_comanda_aberta = 50811

    segunda-feira, 7 de novembro de 2016 18:56
  • Entendi, no caso queria trazer uma unica linha colocando virgula entre os apelidos, o resto em suas devidas colunas.

    • Editado _Manigold_ segunda-feira, 7 de novembro de 2016 19:03
    segunda-feira, 7 de novembro de 2016 18:58
  • Desculpe, faltou o GROUP BY no final:

    SELECT
     STUFF((SELECT ',' + apelido
            FROM tbl_Funcionario f
            WHERE codigo = Aj.codigo_ajudante
            FOR XML PATH('')), 1, 1, '') AS Apelido
    , C.codigo
    , C.observacao
    , C.desconto
    , S.servico
    , I.item
    , C.valor 
    
    FROM tbl_ComandaServico C
    
    JOIN tbl_Servico  S  on  C.codigo_servico  = S.codigo
    JOIN tbl_Item I on C.codigo_item = I.codigo
    JOIN tbl_AjudanteServico AJ on Aj.Codigo_Comanda = C.codigo_comanda_aberta 
    JOIN tbl_Funcionario Func on Aj.codigo_ajudante  = Func.codigo
    
    WHERE
     C.codigo_comanda_aberta = 50811
    
    GROUP BY
    C.codigo
    , C.observacao
    , C.desconto
    , S.servico
    , I.item
    , C.valor 
    Se não funcionar, pode postar o resultado que você esta obtendo por favor?

    segunda-feira, 7 de novembro de 2016 19:05
  • Puts, Sergio ainda não funcionou continua mostrando 2 linhas.

    segunda-feira, 7 de novembro de 2016 19:11
  • Tente assim então:

    SELECT
     STUFF((SELECT ',' + cast(apelido as varchar(max))
            FROM tbl_Funcionario f
            WHERE codigo = Aj.codigo_ajudante
            FOR XML PATH('')), 1, 2, '') AS Apelido
    , C.codigo
    , C.observacao
    , C.desconto
    , S.servico
    , I.item
    , C.valor 
    
    FROM tbl_ComandaServico C
    
    JOIN tbl_Servico  S  on  C.codigo_servico  = S.codigo
    JOIN tbl_Item I on C.codigo_item = I.codigo
    JOIN tbl_AjudanteServico AJ on Aj.Codigo_Comanda = C.codigo_comanda_aberta 
    JOIN tbl_Funcionario Func on Aj.codigo_ajudante  = Func.codigo
    
    WHERE
     C.codigo_comanda_aberta = 50811
    
    GROUP BY
    C.codigo
    , C.observacao
    , C.desconto
    , S.servico
    , I.item
    , C.valor 

    segunda-feira, 7 de novembro de 2016 19:22
  • Ola amigo, quero unificar somente  os nomes, concatenar no caso, o resto fica padrao, deixar tudo em uma unica linha.

    1)query 1

                 

    --Criei uma tabela temporária com os dados de demostração 
    --na sua SP 
    IF ( OBJECT_ID('TEMPDB..#Dados') IS NOT NULL )
        DROP TABLE #Dados;

    CREATE TABLE #Dados
        (
          Apelido VARCHAR(max),
     Codigo VARCHAR(max),
     Observavao varchar(max),
     Desconto DECIMAL(18,2),
    Servico varchar(max),
    Item varchar(max),
    Valor DECIMAL(18,2)


        );

     INSERT INTO #Dados
             ( Apelido ,
               Codigo ,
               Observavao ,
               Desconto ,
               Servico ,
               Item ,
               Valor
             )
     VALUES  ( 'ZE' , -- Apelido - varchar(max)
               '71273' , -- Codigo - varchar(max)
               '' , -- Observavao - varchar(max)
               0 , -- Desconto - decimal
               'Alisamento' , -- Servico - varchar(max)
               'A partir de' , -- Item - varchar(max)
               150  -- Valor - decimal
             ),
       ( 'ALE' , -- Apelido - varchar(max)
               '71273' , -- Codigo - varchar(max)
               '' , -- Observavao - varchar(max)
               0 , -- Desconto - decimal
               'Alisamento' , -- Servico - varchar(max)
               'A partir de' , -- Item - varchar(max)
               150  -- Valor - decimal
             )



    SELECT
      STUFF((SELECT ', ' + CAST(T.Apelido AS VARCHAR(10))       [text()]
             FROM #Dados T 
             WHERE T.Codigo = t.Codigo
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido,
     C.Codigo ,
     C.Observavao ,
     C.Desconto ,
     C.Servico ,
     C.Item ,
     C.Valor
    FROM #Dados AS C

    --Query 2

    SELECT DISTINCT
      STUFF((SELECT ', ' + CAST(T.Apelido AS VARCHAR(10))       [text()]
             FROM #Dados T 
             WHERE T.Codigo = t.Codigo
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido,
     C.Codigo ,
     C.Observavao ,
     C.Desconto ,
     C.Servico ,
     C.Item ,
     C.Valor
    FROM #Dados AS C
    

    veja o resultado , pelo que eu entendi e isso ?? se for basta adequar o codigo no seu SELECT


    Wesley Neves

    • Marcado como Resposta _Manigold_ segunda-feira, 7 de novembro de 2016 20:05
    segunda-feira, 7 de novembro de 2016 19:27
  • Puts Sergio, nao foi, desculpa te atraplhar.
    segunda-feira, 7 de novembro de 2016 19:34
  • Olá Wesley tudo bem? Existe alguma outra maneira, pois foi definido que na o podemos usar tabelas temporárias. Esse stuff ta fogo kkkkkkkkkk

    Obrigado.

    segunda-feira, 7 de novembro de 2016 19:42
  • Mais uma tentativa então com CTE ao invés de tabela temporária:

    WITH T AS
    (
    SELECT
    Func.Apelido
    , C.codigo
    , C.observacao
    , C.desconto
    , S.servico
    , I.item
    , C.valor 
    
    FROM tbl_ComandaServico C
    
    JOIN tbl_Servico  S  on  C.codigo_servico  = S.codigo
    JOIN tbl_Item I on C.codigo_item = I.codigo
    JOIN tbl_AjudanteServico AJ on Aj.Codigo_Comanda = C.codigo_comanda_aberta 
    JOIN tbl_Funcionario Func on Aj.codigo_ajudante  = Func.codigo
    
    WHERE
     C.codigo_comanda_aberta = 50811
    )
    
    SELECT
      STUFF((SELECT ', ' + CAST(Apelido AS VARCHAR(10))       [text()]
             FROM T 
             WHERE Codigo = t.Codigo
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido,
     C.Codigo ,
     C.Observavao ,
     C.Desconto ,
     C.Servico ,
     C.Item ,
     C.Valor
    FROM T
    
    GROUP BY 
    C.Codigo ,
     C.Observavao ,
     C.Desconto ,
     C.Servico ,
     C.Item ,
     C.Valor


    • Editado Sergio Marchetti segunda-feira, 7 de novembro de 2016 19:46
    • Marcado como Resposta _Manigold_ segunda-feira, 7 de novembro de 2016 20:05
    segunda-feira, 7 de novembro de 2016 19:44
  • ta dando erro:

    Msg 4104, Level 16, State 1, Line 38
    Não foi possível vincular o identificador de várias partes "C.Codigo".
    Msg 4104, Level 16, State 1, Line 39
    Não foi possível vincular o identificador de várias partes "C.Observavao".
    Msg 4104, Level 16, State 1, Line 40
    Não foi possível vincular o identificador de várias partes "C.Desconto".
    Msg 4104, Level 16, State 1, Line 41
    Não foi possível vincular o identificador de várias partes "C.Servico".
    Msg 4104, Level 16, State 1, Line 42
    Não foi possível vincular o identificador de várias partes "C.Item".
    Msg 4104, Level 16, State 1, Line 43
    Não foi possível vincular o identificador de várias partes "C.Valor".

    segunda-feira, 7 de novembro de 2016 19:48
  • WITH T AS
    (
    SELECT
    Func.Apelido
    , C.codigo
    , C.observacao
    , C.desconto
    , S.servico
    , I.item
    , C.valor 
    
    FROM tbl_ComandaServico C
    
    JOIN tbl_Servico  S  on  C.codigo_servico  = S.codigo
    JOIN tbl_Item I on C.codigo_item = I.codigo
    JOIN tbl_AjudanteServico AJ on Aj.Codigo_Comanda = C.codigo_comanda_aberta 
    JOIN tbl_Funcionario Func on Aj.codigo_ajudante  = Func.codigo
    
    WHERE
     C.codigo_comanda_aberta = 50811
    )
    
    SELECT
      STUFF((SELECT ', ' + CAST(Apelido AS VARCHAR(10))       [text()]
             FROM T 
             WHERE Codigo = t.Codigo
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') Apelido,
    T.Codigo ,
    T.Observavao ,
    T.Desconto ,
    T.Servico ,
    T.Item ,
    T.Valor
    FROM T
    
    GROUP BY 
    T.Codigo ,
    T.Observavao ,
    T.Desconto ,
    T.Servico ,
    T.Item ,
    T.Valor


    • Editado Sergio Marchetti segunda-feira, 7 de novembro de 2016 19:53
    • Marcado como Resposta _Manigold_ segunda-feira, 7 de novembro de 2016 19:58
    segunda-feira, 7 de novembro de 2016 19:53
  • Aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

    kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

    • Editado _Manigold_ segunda-feira, 7 de novembro de 2016 19:54
    segunda-feira, 7 de novembro de 2016 19:54
  • Que bom que funcionou!

    Por favor vote na resposta se foi isso mesmo =)

    segunda-feira, 7 de novembro de 2016 19:58
  • votado meu querido. se tivesse um like ia de like kkkkkkkkkkkkk

    grande abs, fica com Deus.

    segunda-feira, 7 de novembro de 2016 20:01