none
Dúvida em Função

    Question


  • Boas..
    Na seguinte função vou buscar os primeiros três registo na tabela Produtos.

        SELECT TOP 3 @Produto = @Produto + Produto + @Caract 
        FROM Encomenda LEFT JOIN 
        Produtos ON Encomenda.Cod = dbo.Produtos.Cod
        WHERE (Encomenda.Cod = @Cod) 

    O meu problema está no seguinte, eu gostava de que quando existem mais de três produtos eles acrescentar '(...)'
    A função é chamada num SP da seguinte maneira FuncaoBuscarProdutos(Cod, '; ')

    Como posso fazer isso? Com um IF?

    Desde já obrigado..
    Tuesday, February 03, 2009 11:21 AM

Answers

  • Olá,

    Para utilizar o COUNT(*) no mesmo statement, você teria que agrupar os dados. Além de eu não conhecer tua modelagem para ver se isto é possível, o agrupamento faria parar de funcionar a cláusula TOP. O jeito é isolar a query que forma a concatenação e criar outra para contar os registros.

    Veja o exemplo abaixo (descomente o INSERT para testar a trocar de ';' por '...'. Depois aplique no seu código e veja se funciona.

     

    1 --// usado apenas para facilitar a visualização do resultado deste exemplo  
    2 SET NOCOUNT ON 
    3  
    4 --// cenário  
    5 DECLARE @TABLE TABLE (Produto VARCHAR(10))  
    6 INSERT INTO @TABLE VALUES ('Produto1')  
    7 INSERT INTO @TABLE VALUES ('Produto2')  
    8 INSERT INTO @TABLE VALUES ('Produto3')  
    9 INSERT INTO @TABLE VALUES ('Produto4')  
    10  
    11 --// contador  
    12 DECLARE @CONTADOR INT 
    13 SELECT @CONTADOR = COUNT(*) FROM @TABLE 
    14  
    15 --// concatenação  
    16 DECLARE @PRODUTO VARCHAR(100)  
    17 SELECT TOP 3 @Produto = ISNULL(@Produto + ';''') + Produto  
    18 FROM @TABLE 
    19 GROUP BY Produto  
    20  
    21 --// exibição formatada  
    22 IF(@CONTADOR > 3)  
    23 BEGIN 
    24     PRINT @Produto + '...' 
    25 END 
    26 ELSE BEGIN 
    27     PRINT @Produto + ';' 
    28 END 

    Um abraço,
    Raul Santos Neto

     

    • Marked as answer by Vitor Martins Tuesday, February 03, 2009 2:09 PM
    • Unmarked as answer by Vitor Martins Tuesday, February 03, 2009 3:45 PM
    • Marked as answer by Vitor Martins Tuesday, February 03, 2009 3:52 PM
    Tuesday, February 03, 2009 12:42 PM
    Moderator

All replies

  • Olá,

    Você gostaria de acrescentar ... onde? Outra coisa, porque você passa um ; como parâmetro da função?

    Abraços


    Demétrio Silva
    Tuesday, February 03, 2009 11:30 AM
  • Neste momento o resultado é algo do género
    Produto1; Produto2; Produto3;

    Passo um ; como parametro que é o caracter que serve de separador...

    E eu queria que aparecesse da seguinte maneira se tivesse mais de 3 produtos
    Produto1; Produto2; Produto3; (...)

    para dar a entender que existem mais produtos..
    Tuesday, February 03, 2009 11:32 AM
  • Olá,

    Segue um exemplo:

     

    use ADVENTUREWORKS  
    GO  
     
    select top 3  
        case 
            when COUNT(*) > 3 then 
                FirstName + '...' 
            else 
                FirstName  
        end 
    from Person.Contact  
    group by FirstName 

     


    Demétrio Silva
    Tuesday, February 03, 2009 11:45 AM

  • Adaptei da seguinte maneira, mas deu erro no '='

    CASE WHEN (COUNT(*) = 0) THEN  
                @Produto = @Produto 
            CASE WHEN (COUNT(*) > 3) THEN 
                @Produto = @Produto + Produto + @Carac + '(...)' 
            ELSE 
                @Produto = @Produto + Produto + @Carac 


    Tuesday, February 03, 2009 11:49 AM
  • Olá,

    Faz o seguinte:

    CASE 
       WHEN (COUNT(*) = 0) THEN     
         @Produto = @Produto    
       WHEN (COUNT(*) > 3) THEN    
         @Produto = @Produto + Produto + @Carac + '(...)'    
       ELSE    
         @Produto = @Produto + Produto + @Carac    
    END
     

    O que estava errado era a sintaxe do case. Qualquer dúvida sobre sintaxe da uma olhada no BOL.

    Abraços
    Demétrio Silva
    Tuesday, February 03, 2009 11:52 AM

  • Corrigi e tenho da seguinte maneira, mas continua a dar o erro..

        SELECT TOP 3  
            CASE  
               WHEN (COUNT(*) = 0) THEN      
                 @Produto = @Produto 
               WHEN (COUNT(*) > 3) THEN     
                 @Produto = @Produto + Produto + @Carac + '(...)'   
               ELSE     
                 @Produto = @Produto + Produto + @Carac 
            END 
        FROM Encomenda LEFT JOIN 
        Produtos ON Encomenda.Cod = Produtos.Cod 
        WHERE (Encomenda.Cod = @Cod) 

    Tuesday, February 03, 2009 12:07 PM
  • Vitor,

    Peço a liberade para entrar agora no post!!!

    Mas qual é a mensagem de erro?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    Tuesday, February 03, 2009 12:37 PM
  • Olá,

    Para utilizar o COUNT(*) no mesmo statement, você teria que agrupar os dados. Além de eu não conhecer tua modelagem para ver se isto é possível, o agrupamento faria parar de funcionar a cláusula TOP. O jeito é isolar a query que forma a concatenação e criar outra para contar os registros.

    Veja o exemplo abaixo (descomente o INSERT para testar a trocar de ';' por '...'. Depois aplique no seu código e veja se funciona.

     

    1 --// usado apenas para facilitar a visualização do resultado deste exemplo  
    2 SET NOCOUNT ON 
    3  
    4 --// cenário  
    5 DECLARE @TABLE TABLE (Produto VARCHAR(10))  
    6 INSERT INTO @TABLE VALUES ('Produto1')  
    7 INSERT INTO @TABLE VALUES ('Produto2')  
    8 INSERT INTO @TABLE VALUES ('Produto3')  
    9 INSERT INTO @TABLE VALUES ('Produto4')  
    10  
    11 --// contador  
    12 DECLARE @CONTADOR INT 
    13 SELECT @CONTADOR = COUNT(*) FROM @TABLE 
    14  
    15 --// concatenação  
    16 DECLARE @PRODUTO VARCHAR(100)  
    17 SELECT TOP 3 @Produto = ISNULL(@Produto + ';''') + Produto  
    18 FROM @TABLE 
    19 GROUP BY Produto  
    20  
    21 --// exibição formatada  
    22 IF(@CONTADOR > 3)  
    23 BEGIN 
    24     PRINT @Produto + '...' 
    25 END 
    26 ELSE BEGIN 
    27     PRINT @Produto + ';' 
    28 END 

    Um abraço,
    Raul Santos Neto

     

    • Marked as answer by Vitor Martins Tuesday, February 03, 2009 2:09 PM
    • Unmarked as answer by Vitor Martins Tuesday, February 03, 2009 3:45 PM
    • Marked as answer by Vitor Martins Tuesday, February 03, 2009 3:52 PM
    Tuesday, February 03, 2009 12:42 PM
    Moderator
  • Mensagem de erro
    Error syntax near '='
    Tuesday, February 03, 2009 1:12 PM
  • Olá Raul,

    Esqueci de avisar ao nosso colega para usar o Group BY. No entanto, group by não faz o top parar de funcionar. Dependendo d que você deseja.

    Para este exemplo mesmo não o faz parar de funcionar:

    SELECT   
        TITLE, COUNT(FirstName)  
    FROM Person.Contact  
    GROUP BY TITLE  
     
    SELECT TOP 3  
        TITLE, COUNT(FirstName)  
    FROM Person.Contact  
    GROUP BY TITLE 

    Abraços
    Demétrio Silva
    Tuesday, February 03, 2009 3:17 PM
  • Olá Demetrio,

    Realmente vc está certo, não faz parar de funcionar, mas para a atribuição do jeito que ele estava utilizando...

    TOP 3 @Produto = ISNULL(@Produto + ';', '') + Produto

    ...o COUNT retornaria sempre 1.

    Me expressei mal. Não era "parar de funcionar" e sim "não funcionaria direito". :)

    Um abraço,
    Raul Santos Neto
    Tuesday, February 03, 2009 3:26 PM
    Moderator
  • Valeu Raul,

    Realmente sua solução é a que atende o caso.

    Abraços


    Demétrio Silva
    Tuesday, February 03, 2009 4:19 PM