none
Concatenando campos utilizando subquery RRS feed

  • Pergunta

  • Boa tarde!
    Pessoal sou leitora assídua de fóruns e hoje estou necessitando muito de uma ajudinha de vocês!
    Estou montando um relatório e cheguei em um ponto que preciso concatenar o mesmo campo em um campo novo. Explico:

    Tenho uma tabela que me traz o seguinte resultado:

    seq    descricao
    ------ --------------------------------------------------
    1      CHAVEIROS EM COURO PRETO C/ LOGOMAR
    2      CA RR (brinde) 250 un.

    Esse campo descrição no relatório vira um campo só então preciso juntar as duas frases em uma só. Eu consegui concatenar o campo com ele mesmo utilizando uma subquery:

    SELECT DISTINCT
        (SELECT LITE.DESCRICAO AS DESC1
         FROM LITE
         WHERE DATA_SET = 'SUPC' AND SEQ = 1 AND NUMERO = 234) +
        (SELECT LITE.DESCRICAO AS DESC2
         FROM LITE
         WHERE DATA_SET = 'SUPC' AND SEQ = 2 AND NUMERO = 234)AS OBSPEDIDO
    FROM LITE WHERE DATA_SET = 'SUPC'

    Até aqui beleza, o problema é que esse select vai entrar dentro de uma view e eu não posso fixar o campo NUMERO na view, pois o mesmo é um número de pedido e isso será filtrado pelo usuário no relatório.

    Quando eu tiro esse campo do select e tento executar dá o seguinte erro:

    Msg 512, Level 16, State 1, Line 1
    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

    Quando coloquei o select dentro da view fazendo relacionado com join deu o mesmo erro. Alguém pode me ajudar?

    Obrigada.

    Êmili.
    terça-feira, 6 de outubro de 2009 19:35

Respostas

  • Pela hora é bom dia

    veja se estes 2 exemplos te ajuda

    Alimentando os dados

    -- Criando os dados a serem manipulados
    USE tempdb
    GO
    
    CREATE TABLE Lite
          (
                 Numero TINYINT 
                ,IdSeq TINYINT 
                ,Descricao VARCHAR(50)
                ,Data_Set VARCHAR(30)
                ,DtCadastro DATE DEFAULT(GETDATE())
          )
    GO
    ----INSERINDO VALORES
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(1,1,'CHAVEIROS EM COURO PRETO C/ LOGOMAR','SUPC')
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(1,2,'CA RR (brinde) 250 un.','SUPC')
    
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(2,1,'DOMINÓ INFANTIL COM PEÇ','SUPC')
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(2,2,'AS AMARELAS (brinde) 20 un.','SUPC')
    
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(3,1,'DAMA PEQUE','SUPC')
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(3,2,'NA DE MADEIRA (brinde) 50 un.','SUPC')
    
    
    /* 1° Exemplo: "serve apenas p/ SQL SERVER 2005 e 2008" */
    
    SELECT 
        A.Data_Set, A.Numero,  
        (
            SELECT LTRIM(RTRIM(B.Descricao))AS [data()]
            FROM  Lite AS B
            WHERE B.Data_Set = A.Data_Set AND B.Numero = A.Numero
            FOR XML PATH('')
        ) AS Descricao
     FROM  Lite as A
     WHERE A.Data_Set = 'SUPC'
     GROUP BY A.Data_Set, A.Numero
    
    --------------------------------------------------------------
    /* 2° Exemplo: Criar uma função que Concatena */
    
    CREATE FUNCTION dbo.fnUnirLite(@Data_Set VARCHAR(8), @Numero INT)
    RETURNS VARCHAR(MAX)
    BEGIN
    	DECLARE @Texto VARCHAR(MAX)
    	SELECT @Texto = ISNULL(@Texto,'') + Descricao 
    	  FROM Lite AS A WITH(NOLOCK) 
    	 WHERE A.Data_Set = @Data_Set AND Numero = @Numero 
    	
    	RETURN @Texto
    END
    
    GO
    SELECT A.Data_Set, A.Numero, dbo.fnUnirLite(A.Data_Set, A.Numero) AS Descricao FROM Lite as A WHERE A.Data_Set = 'SUPC' GROUP BY A.Data_Set, A.Numero




    Espero que lhe seja útil, se for classifique-o.


    att. Leonardo Marcelino
    sexta-feira, 16 de outubro de 2009 04:17

Todas as Respostas

  • Olá Emilig,

    Você esta tirando somente o campo número ou toda a condição que envolve o campo número?

    Se entendi direito, tire toda a condição que envolve o campo número como mostra o exemplo abaixo com a condição em negrito!

          SELECT DISTINCT

                (SELECT LITE.DESCRICAO AS DESC1

               FROM LITE

              WHERE DATA_SET = 'SUPC' AND SEQ = 1 AND NUMERO = 234) +

                (SELECT LITE.DESCRICAO AS DESC2

                   FROM LITE

              WHERE DATA_SET = 'SUPC' AND SEQ =AND NUMERO = 234)AS OBSPEDIDO

            FROM LITE WHERE DATA_SET = 'SUPC'

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo

    MCP| MCTS em SQL Server 2008 | Projetista de Dados

    Blog:
    http://heberton-melo.spaces.live.com/

    quarta-feira, 7 de outubro de 2009 03:25
  • Olá Heberton!

    Eu estou tirando toda a condição, a subquery tem que ficar assim:

    SELECT DISTINCT

                ( SELECT LITE. DESCRICAO AS DESC1

                 FROM LITE

                 WHERE DATA_SET = 'SUPC' AND SEQ = 1 ) +

                ( SELECT LITE. DESCRICAO AS DESC2

                 FROM LITE

                 WHERE DATA_SET = 'SUPC' AND SEQ = 2 ) AS OBSPEDIDO

    FROM LITE WHERE DATA_SET = 'SUPC'

     

    Pois eu não posso ter essa condição no select. Essa subquery vai entrar em uma view mais ou menos desse modo:

     

    SELECT  (outras tabelas e campos),
                        (SELECT DISTINCT
                            (SELECT LITE.DESCRICAO AS DESC1
                             FROM LITE
                             WHERE DATA_SET = 'SUPC' AND SEQ = 1) +
                            (SELECT LITE.DESCRICAO AS DESC2
                             FROM LITE
                             WHERE DATA_SET = 'SUPC' AND SEQ = 2) AS OBSPEDIDO
                         FROM LITE WHERE DATA_SET = 'SUPC')
    FROM         dbo.SUPC INNER JOIN
                     dbo.LITE ON dbo.SUPC.EMP_FIL = dbo.LITE.EMP_FIL AND dbo.SUPC.NR_PEDIDO = dbo.LITE.NUMERO
    WHERE      dbo.LITE.DATA_SET = 'SUPC'

     

    A view é um pouco maior mas basicamente esse é o pedaço em que entra a subquery.

     

    Êmili.

    quarta-feira, 7 de outubro de 2009 11:20
  • Êmili,

     

    Acho que você pode fazer da seguinte forma:


    select distinct descricao + ( select y.descricao

    				from lite y
    				where data_set = 'supc' 
    				 and seq = 2 
    				 and y.numero = x.numero) as obspedido
    from lite x
    where data_set = 'supc'
     and seq = 1

     


    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Carlos Eduardo Pieren - MCP
    quarta-feira, 7 de outubro de 2009 14:31
  • Êmili,

    O importante no processo de concatenação de dados é unir informações do mesmo datatype, caso você esteja utilizando datatypes diferentes é necessário realizar a conversão implicita para evitar que ocorra erros ou perda de informações.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 7 de outubro de 2009 15:02
  • Olá Êmili,

    Qual o tipo de dado do campo DATA_SET? De onde esta vindo esse campo?

    Pois se o tipo de dado do campo DATA_SET não for do tipo dado que seja compatível com a string que você esta fazendo o teste, ira gerar um erro, sendo necessário você fazer a conversão para evitar erros.

    Veja o exemplo que criei de acordo com a sua estrutura apresentada. Porem o tipo de dados do campo Data_Set é compatível com a string utilizada no teste.


    --CRIANDO A ENTIDADE TEMPORÁRIA

    CREATE TABLE #Lite

          (

                 IdSeq TINYINT IDENTITY(1,1)

                      PRIMARY KEY

                ,NoDescricao VARCHAR(50)

                ,Data_Set VARCHAR(30)

                ,DaCadastro DATE

                      DEFAULT(GETDATE())

          )

    GO

    --INSERINDO VALORES

    INSERT INTO #Lite(NoDescricao, Data_Set)

          VALUES('CHAVEIROS EM COURO PRETO C/ LOGOMAR','SUPC')

               ,('CA RR (brinde) 250 un.','SUPC')

    GO

    --CONSULTA 

    SELECT DISTINCT

                (SELECT NoDescricao

                   FROM #Lite

                  WHERE Data_Set = 'SUPC' AND IdSeq = 1 ) +

                (SELECT NoDescricao

                   FROM #Lite

                  WHERE Data_Set = 'SUPC' AND IdSeq = 2 ) AS [Observação Pedido]

      FROM #Lite

     WHERE Data_Set = 'SUPC'

    Resultado.

    Observação Pedido
    ----------------------------------------------------------------------------------------------------
    CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un. 

    (1 row(s) affected)


    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP| MCTS em SQL Server 2008 | Projetista de Dados

    Blog: http://heberton-melo.spaces.live.com/

    quarta-feira, 7 de outubro de 2009 18:12
  • Pessoal, boa tarde!

    Obrigada pelas respostas.

    Os campos da tabela LITE são compatíveis, tanto no campo DATA_SET quanto no campo DESCRICAO os dados são strings.

    Eu não entendo bem como funciona essa tabela, mas ela grava dados de outras tabelas.

    No meu caso os campos que me interessam são:

    data_set descricao                                                  seq   numero
    --------   -------------------------------------------------- ------ -----------
    SURQ     CILINDRO P/ MAQUINA DE XEROX              2       12484


    O campo data_set faz referencia a outras tabelas, nesse caso eu preciso dos dados da tabela SUPC que é uma tabela de pedido de compras, por isso o filtro no where DATA_SET = 'SUPC'

    Quando o usuário cadastra um pedido de compras ele pode cadastrar uma observação nesse pedido, que ao invés de ser gravado na tabela SUPC é gravado nessa LITE no campo DESCRICAO.

    O problema é que a informação é gravada quebrada, ficando metade na linha do campo SEQ 1 e a outra metade no SEQ 2:

    select data_set, descricao, seq, numero from lite where numero = 234 and data_set = 'supc'

    data_set descricao                                                      seq    numero
    --------   --------------------------------------------------     ------ -----------
    SUPC     CHAVEIROS EM COURO PRETO C/ LOGOMAR   1       234
    SUPC     CA RR (brinde) 250 un.                                  2       234


    Por isso eu criei a subquery concatenando os campos. O campo NUMERO é o número do pedido de compras. Quando eu faço a consulta fixando um pedido o resultado vem direitinho:

    SELECT DISTINCT
    (SELECT LITE.DESCRICAO AS DESC1 FROM LITE WHERE DATA_SET = 'SUPC' AND SEQ = 1 AND NUMERO = 234) +
    (SELECT LITE.DESCRICAO AS DESC2 FROM LITE WHERE DATA_SET = 'SUPC' AND SEQ = 2 AND NUMERO = 234) AS OBSPEDIDO
    FROM LITE WHERE DATA_SET = 'SUPC'

    OBSPEDIDO
    --------------------------------------------------------------
    CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.

    (1 row(s) affected)


    Só que eu não posso fixar esse número de pedido, porque esse é um filtro que o relatório vai fazer, ou seja, o usuário vai digitar o número do pedido ao selecionar o relatório.

    Dei uma diminuída na view mas basicamente o pedaço onde entra a subquery é esse:

    SELECT    SUPC.FORNEC, SUPC.NR_PEDIDO, SUPD.LINHA_PED, SUPD.C_PROD, SUPD.QTDE, SUPD.UNIDADE as UN,
        (SELECT DISTINCT
          (SELECT LITE.DESCRICAO AS DESC1 FROM LITE WHERE DATA_SET = 'SUPC' AND SEQ = 1 and numero = 234) +
          (SELECT LITE.DESCRICAO AS DESC2 FROM LITE WHERE DATA_SET = 'SUPC' AND SEQ = 2 and numero = 234) AS OBSPEDIDO
        FROM LITE WHERE DATA_SET = 'SUPC')
    FROM SUPC INNER JOIN
         SUPD ON SUPC.EMP_FIL = SUPD.EMP_FIL AND SUPC.FORNEC = SUPD.FORNEC AND SUPC.NR_PEDIDO = SUPD.NR_PEDIDO INNER JOIN
         LITE ON SUPC.EMP_FIL = LITE.EMP_FIL AND SUPC.NR_PEDIDO = LITE.NUMERO
    WHERE LITE.DATA_SET = 'SUPC'


    Colocando a subquery assim com o número do pedido de compras o resultado vem mais ou menos correto, porém traz a mesma informação (descrição) em todos os pedidos:

    FORNEC            NR_PEDIDO      LINHA_PED       C_PROD     QTDE          UN
    ------------         ---------            ---------            ------         --------- ---   ----- ----------------------------------------------------
    728040570001   3097                1                      049           60.000000    PC   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    728040570001   3097                2                      096           60.000000    PC   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    728040570001   3097                3                      096           72.000000    PC   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    728040570001   3097                4                      096           50.000000    PC   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    728040570001   3100                1                      049           60.000000    PC   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    728040570001   3100                2                      096           60.000000    PC   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    728040570001   3100                3                      096           72.000000    PC   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    728040570001   3100                4                      096           50.000000    PC   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    606432280266   12105              1                      J026          20000.000    KG   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    606432280266   12105              2                      J026          20000.000    KG   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    606432280266   12105              3                      J026          20000.000    KG   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    606432280266   12105              4                      J032          4000.0000    KG   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    606432280266   12105              5                      J032          4000.0000    KG   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.
    606432280266   12105              6                      J032          4000.0000    KG   CHAVEIROS EM COURO PRETO C/ LOGOMARCA RR (brinde) 250 un.

    Quando o resultado esperado seria:

    FORNEC            NR_PEDIDO      LINHA_PED       C_PROD     QTDE          UN
    ------------         ---------            ---------            ------         --------- ---   ----- ----------------------------------------------------
    728040570001   3097                1                      049           60.000000    PC   NULL
    728040570001   3097                2                      096           60.000000    PC   NULL
    728040570001   3097                3                      096           72.000000    PC   NULL
    728040570001   3097                4                      096           50.000000    PC   NULL
    728040570001   3100                1                      049           60.000000    PC   LICENCA DE USO DE SOFTWARE
    728040570001   3100                2                      096           60.000000    PC   LICENCA DE USO DE SOFTWARE
    728040570001   3100                3                      096           72.000000    PC   LICENCA DE USO DE SOFTWARE
    728040570001   3100                4                      096           50.000000    PC   LICENCA DE USO DE SOFTWARE
    606432280266   12105              1                      J026          20000.000    KG   MATERIAL FATURADO PELA KSR - BELO HORIZONTE
    606432280266   12105              2                      J026          20000.000    KG   MATERIAL FATURADO PELA KSR - BELO HORIZONTE
    606432280266   12105              3                      J026          20000.000    KG   MATERIAL FATURADO PELA KSR - BELO HORIZONTE
    606432280266   12105              4                      J032          4000.0000    KG   MATERIAL FATURADO PELA KSR - BELO HORIZONTE
    606432280266   12105              5                      J032          4000.0000    KG   MATERIAL FATURADO PELA KSR - BELO HORIZONTE
    606432280266   12105              6                      J032          4000.0000    KG   MATERIAL FATURADO PELA KSR - BELO HORIZONTE

    Ou seja, no campo descricao eu preciso que saia a concatenação da descrição do pedido, mas sem fixar o número na subquery.

    Pessoal desculpe a amolação mas é que já tentei de vários jeitos e ainda não consegui.

    Espero que eu tenha conseguido explicar melhor.

    Valeu mesmo pela ajuda!

    Êmili.
    quarta-feira, 7 de outubro de 2009 20:34
  • Pela hora é bom dia

    veja se estes 2 exemplos te ajuda

    Alimentando os dados

    -- Criando os dados a serem manipulados
    USE tempdb
    GO
    
    CREATE TABLE Lite
          (
                 Numero TINYINT 
                ,IdSeq TINYINT 
                ,Descricao VARCHAR(50)
                ,Data_Set VARCHAR(30)
                ,DtCadastro DATE DEFAULT(GETDATE())
          )
    GO
    ----INSERINDO VALORES
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(1,1,'CHAVEIROS EM COURO PRETO C/ LOGOMAR','SUPC')
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(1,2,'CA RR (brinde) 250 un.','SUPC')
    
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(2,1,'DOMINÓ INFANTIL COM PEÇ','SUPC')
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(2,2,'AS AMARELAS (brinde) 20 un.','SUPC')
    
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(3,1,'DAMA PEQUE','SUPC')
    INSERT INTO Lite(Numero,IdSeq,Descricao, Data_Set) VALUES(3,2,'NA DE MADEIRA (brinde) 50 un.','SUPC')
    
    
    /* 1° Exemplo: "serve apenas p/ SQL SERVER 2005 e 2008" */
    
    SELECT 
        A.Data_Set, A.Numero,  
        (
            SELECT LTRIM(RTRIM(B.Descricao))AS [data()]
            FROM  Lite AS B
            WHERE B.Data_Set = A.Data_Set AND B.Numero = A.Numero
            FOR XML PATH('')
        ) AS Descricao
     FROM  Lite as A
     WHERE A.Data_Set = 'SUPC'
     GROUP BY A.Data_Set, A.Numero
    
    --------------------------------------------------------------
    /* 2° Exemplo: Criar uma função que Concatena */
    
    CREATE FUNCTION dbo.fnUnirLite(@Data_Set VARCHAR(8), @Numero INT)
    RETURNS VARCHAR(MAX)
    BEGIN
    	DECLARE @Texto VARCHAR(MAX)
    	SELECT @Texto = ISNULL(@Texto,'') + Descricao 
    	  FROM Lite AS A WITH(NOLOCK) 
    	 WHERE A.Data_Set = @Data_Set AND Numero = @Numero 
    	
    	RETURN @Texto
    END
    
    GO
    SELECT A.Data_Set, A.Numero, dbo.fnUnirLite(A.Data_Set, A.Numero) AS Descricao FROM Lite as A WHERE A.Data_Set = 'SUPC' GROUP BY A.Data_Set, A.Numero




    Espero que lhe seja útil, se for classifique-o.


    att. Leonardo Marcelino
    sexta-feira, 16 de outubro de 2009 04:17
  • Êmili,

         Você já tentou desta forma:

    select distinct descricao + ( select y.descricao

    				from lite y
    				where data_set = 'supc' 
    				 and seq = 2 
    				 and y.numero = x.numero) as obspedido
    from lite x
    where data_set = 'supc'
     and seq = 1





    Caso tenha lhe ajudado não se esqueça de marcar como útil, só assim ajudará a melhorar a qualidade do fórum.





    Carlos Eduardo Pieren - MCP
    sexta-feira, 16 de outubro de 2009 12:02
  • Carlos, bom dia!

    Testei sua query e funcionou sim, só que depois eu acabei descobrindo que cada produto pode ter uma ou mais sequencias, eu não tenho como saber, e nesse caso eu estou fixando a quantidade de sequências.

    No meu caso a query proposta pelo Leonardo se aplicou melhor, mas muito obrigada, ajudou bastante.

    Êmili.
    segunda-feira, 19 de outubro de 2009 12:47
  • Leonardo, bom dia!

    Cara seu primeiro exemplo resolveu de uma vez, muito obrigada!

    Agora ainda estou precisando de uma ajudinha, será que você pode me ajudar?

    Eu incluí o select dentro da view que eu havia criado:


    SELECT      dbo.SUPC.EMP_FIL, dbo.SUPC.STA_REG, dbo.SUPC.COD_INDICE, dbo.TABG.DESCRICAO AS moeda, dbo.SUPC.FORNEC, dbo.SUPC.DT_PEDIDO,
                          dbo.SUPC.NR_PEDIDO, dbo.SUPD.LINHA_PED, dbo.SUPD.C_PROD, dbo.SUPD.QTDE, dbo.SUPD.UNIDADE, dbo.SUPD.VR_UNIT, dbo.SUPD.PERC_DESC,
                          dbo.SUPD.PORC_ICM, dbo.SUPD.PERC_IPI, dbo.SUPD.VLR_IPI, dbo.SUPD.PRECO_TOT, dbo.SUPC.VLR_DESC, dbo.SUPC.VLR_SEGURO, dbo.SUPC.TOTAL_IPI,
                          dbo.SUPC.VLR_FRETE, dbo.SUPC.VLR_TOTAL, dbo.SUPC.DT_ENTREG, dbo.SUPC.COMPRADOR, dbo.CPCO.NOME AS nomecomprador, dbo.CPCO.DDD,
                          dbo.CPCO.TELEFONE AS telcomprador, dbo.CPCO.E_MAIL AS emailcomprador, dbo.SUPC.COND_PAGTO, dbo.CPAG.EXTENSO_1, dbo.USUA.NOME, dbo.USUA.CGC,
                          dbo.USUA.CGC_DG, dbo.USUA.CIDADE, dbo.USUA.ENDERECO, dbo.USUA.CEP, dbo.USUA.ESTADO, dbo.USUA.INSCR_EST, dbo.CFOR.CGC_CPF,
                          dbo.CFOR.NOME_FANTAS, dbo.CFOR.RAZ_SOCIAL, dbo.CFOR.COMPLEM_RZ, dbo.CFOR.DIG_CGC_CPF, dbo.CFOR.ENDERECO AS endfornec,
                          dbo.CFOR.CEP AS cepfornec, dbo.CFOR.BAIRRO, dbo.CFOR.CIDADE AS cidadefornec, dbo.CFOR.ESTADO AS estadofornec, dbo.CFOR.TELE_DDD,
                          dbo.CFOR.TELEFONE AS telfornec, dbo.CFOR.TELEFAX, dbo.CFOR.CONTATO,
                          (CASE WHEN dbo.USUA.EMPRESA = '3187' THEN 'Rua Masato Misawa, 430' WHEN dbo.USUA.EMPRESA = '3188' THEN 'RUA MASATO MISAWA, 430' END)
                          AS ENDCOBRANCA,
                         LITE.DATA_SET, LITE.NUMERO,
                         (SELECT  LTRIM(RTRIM(B.Descricao))AS [data()]
                          FROM  Lite AS B
                          WHERE B.Data_Set = LITE.Data_Set AND B.Numero = LITE.Numero
                          FOR XML PATH('')
                          ) AS OBSPEDIDO

    FROM         dbo.SUPC INNER JOIN
                          dbo.SUPD ON dbo.SUPC.EMP_FIL = dbo.SUPD.EMP_FIL AND dbo.SUPC.FORNEC = dbo.SUPD.FORNEC AND dbo.SUPC.NR_PEDIDO = dbo.SUPD.NR_PEDIDO AND
                          dbo.SUPC.STA_REG = dbo.SUPD.STA_REG AND dbo.SUPC.ESTAB = dbo.SUPD.ESTAB AND dbo.SUPC.DEPOSITO = dbo.SUPD.DEPOSITO INNER JOIN
                          dbo.CPCO ON dbo.SUPC.EMP_FIL = dbo.CPCO.EMP_FIL AND dbo.SUPC.COMPRADOR = dbo.CPCO.COMPRADOR INNER JOIN
                          dbo.CPAG ON LEFT(dbo.SUPC.EMP_FIL, 4) = dbo.CPAG.EMPRESA AND dbo.SUPC.COND_PAGTO = dbo.CPAG.COD_PGTO INNER JOIN
                          dbo.USUA ON LEFT(dbo.SUPC.EMP_FIL, 4) = dbo.USUA.EMPRESA INNER JOIN
                          dbo.CFOR ON dbo.SUPC.EMP_FIL = dbo.CFOR.EMP_FIL AND dbo.SUPC.FORNEC = dbo.CFOR.FORNEC INNER JOIN
                          dbo.TABG ON LEFT(dbo.SUPC.EMP_FIL, 4) = dbo.TABG.EMPRESA AND dbo.SUPC.COD_INDICE = dbo.TABG.COD_NUM inner join
                          dbo.LITE ON dbo.SUPC.EMP_FIL = dbo.LITE.EMP_FIL AND dbo.SUPC.NR_PEDIDO = dbo.LITE.NUMERO
    WHERE     (dbo.SUPC.ESTAB = 1) AND (dbo.SUPC.DEPOSITO = 1) AND (dbo.TABG.TABELA = 'INDICE-ABC') and (LITE.Data_Set = 'SUPC')
    ORDER BY dbo.SUPC.NR_PEDIDO, dbo.SUPD.LINHA_PED


    O problema que estou tendo é que não consigo agrupar os pedidos. O select que você me passou continha um groupy by mas como eu coloquei o select como subquery não consigo mais colocar ele dentro da view.

    Tentei duas coisas: Colocar DISTINCT antes do Select principal. Até agrupou os pedidos mas trouxe apenas 7 pedidos. Tentei também colocar group by no final do select (após o order by) com todas os campos do select mas deu erro na sintaxe

    Msg 156, Level 15, State 1, Line 28
    Incorrect syntax near the keyword 'GROUP'.

    Preciso que o resultado da view seja esse:

    EMP_FIL       FORNEC      DT_PEDIDO   NR_PEDIDO  LINHA_PED  C_PROD  QTDE   OBSPEDIDO
    31880001     114119999  13/02/2007    4129             1                S001       27600  DRAWBACK - VIA SÃO FRANCISCO DO SUL
    31880001     114119999  13/02/2007    4129             2                S006       55200  DRAWBACK - VIA SÃO FRANCISCO DO SUL
    31880001     484848484  10/10/2009    1234             1                1520       100      Amostra para teste, sem cobrança.
    31880001     484848484  10/10/2009    1234             2                1521       200      Amostra para teste, sem cobrança.
    31880001     484848484  10/10/2009    1234             3                1522       300      Amostra para teste, sem cobrança.


    Desde já agradeço muito.

    Obrigada.

    Êmili.






    segunda-feira, 19 de outubro de 2009 13:17
  • Msg 156, Level 15, State 1, Line 28
    Incorrect syntax near the keyword 'GROUP'.


    O GROUP BY tem q ser antes do ORDER BY



    att. Leonardo Marcelino
    segunda-feira, 19 de outubro de 2009 17:10
  • Se

     

    eu não estiver enganado, a tabela dbo.LITE possui o item 1 e 2 ,
    por isso a necessidade de concatenar a descrição dos ítens, do jeito q ela esta no INNER JOIN
    Ela ira retornar dados em duplicidade, então colocando o Distinct, no meu ponto de vista acho q resolve.

    Tb

     

    não é correto colocar order by dentro da view e sim fora Ex.: select * from "Sua View" order by "A Coluna q vc quiser"


    att. Leonardo Marcelino
    segunda-feira, 19 de outubro de 2009 17:22
  • Leonardo, boa tarde!

    Alterei aqui e deu certinho, muito obrigada pela ajuda e atenção!

    Êmili.
    segunda-feira, 19 de outubro de 2009 18:52