none
Dúvida em cálculo via TSQL RRS feed

  • Pergunta

  • Olá, tenho o seguinte Script:


    Delete Loja
    INSERT INTO Tabela1 (Clientes,Produtos)
    SELECT Clientes, sum(Produtos) as Produtos FROM Balcão1 Group by Clientes


    Bom, observem que o Script faz a Soma de todos os Prudutos comprados "apenas quantidade" por cada Cliente e deposita isso em uma nova tabela!
    Agora o que eu preciso implementar é:

    Para cada novos 10 produtos comprados, esse cliente ganhe 1 cupom de disconto!
    Exemplo:


    Nome: Fulano
    Prudutos: 9
    Cupons: 0


    apos ele compra mais alguma coisa na Loja:


    Nome: Fulano
    Prudutos: 10
    Cupons: 1


    quando ele atingir 20


    Nome: Fulano
    Prudutos: 20
    Cupons: 2

    e assim por diante!



    PS: Tenho que fazer isso em uma Tabela Separado da Tabela "Balcão1", tem que ser na nova tabela mesmo!

    Desde ja agradeço a todos!
    • Editado Gustavo Maia Aguiar terça-feira, 24 de novembro de 2009 10:55 O título anterior não estava relacionado com a dúvida
    terça-feira, 24 de novembro de 2009 09:53

Todas as Respostas

  • Bom Dia,

    Creio que você possa fazer isso com uma trigger (ou codificar a lógica em uma SP ou na aplicação). Ex:

    CREATE TRIGGER trgCumpom ON Produtos
    FOR INSERT
    AS
    BEGIN
        IF EXISTS (SELECT Cliente, COUNT(*) FROM Produtos GROUP BY Cliente HAVING COUNT(*) / 10 > 0)
        BEGIN
            -- Insere os novos ganhadores
            INSERT INTO Cupon
            SELECT Cliente, COUNT(*) / 10 FROM Produtos GROUP BY Cliente
            WHERE NOT EXISTS (SELECT Cliente FROM Cupon WHERE Produtos.Cliente = Cupons.Cliente
    
            -- Atualiza os "velhos" ganhadores
            ;WITH TotalCupons As (SELECT Cliente, COUNT(*) / 10 As Tot FROM Produtos GROUP BY Cliente)
            UPDATE Cupon SET Cupons = Tot
            FROM Cupon INNER JOIN TotalCupons ON Cupon.Cliente = TotalCupons.Cliente
    
    END


    Com esse código, a cada produto que for feito, a trigger irá checar se o cliente tem direito ou não a um cupom. Seria isso ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!814.entry
    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 24 de novembro de 2009 10:54
  • tipo, gostaria que ela seguice de 10 em 10, exemplo, ele ja atualmente tem 275 produtos, e como é em 10 em 10 ele ganhara apenas no 280 e depois no 290.........
    e assim sucessivamente,



    terça-feira, 24 de novembro de 2009 10:57
  • Olá SkyDark,

    Se ele já tem 275 produtos ele merece ou não ganhar 27 cupons ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!814.entry
    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 24 de novembro de 2009 11:02
  • Não, é uma promoção que se inicia hoje por exemplo, e a cada 10, 20, 30, 40 ....... 2000 some de produtos ele ganhar

    Apenas quando a soma dos produtos for = 10, 20, 30, 40 ....... 2000 desta forma...
    terça-feira, 24 de novembro de 2009 11:04
  • Opa,

    Uma idéia é fazer o seguinte:

    -- se já existe registro para aquele cliente, ele só atualiza
    UPDATE Tabela1
    SET Produtos = B.Produtos
    FROM Tabela1 T
    INNER JOIN (
    		SELECT Clientes, sum(Produtos) as Produtos
    		FROM Balcão1 GROUP BY Clientes
    	) AS B ON T.Clientes = B.Clientes
    
    -- para aqueles que não tem, inclui novo registro
    INSERT INTO Tabela1 (Clientes,Produtos)
    SELECT B.Clientes, sum(B.Produtos) as Produtos
    FROM Balcão1 B
    LEFT JOIN Tabela1 T ON T.Clientes = B.Clientes
    WHERE T.Clientes IS NULL
    GROUP BY Clientes
    


    Abraço!!


    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    terça-feira, 24 de novembro de 2009 11:05
  • eu sou meio fraco em Script, vou testando aki e retornando resultados...

    uma coisa, esse 1º código que ja postei a vocês funciona perfeitamente, ele faz a soma dos produtos e agrupa na nova tabela, agora, não tem como apartir dessa nova tabela qe contem a soma fazr apartir dela não ? é que ja tem muita coisa na outra!

    A Tabela Balcão1 ja esta Sobrecarregada de Trigger e JOB
    terça-feira, 24 de novembro de 2009 11:10
  • Bom Dia,

    Mas se a promoção se inicia hoje o correto não seria ele ganhar com 285 ao invés de 280 ? Será de 10 em 10 a partir da quantidade que o cliente possui ou basta ser o primeiro múltiplo de 10 logo após o início da promoção ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!814.entry
    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 24 de novembro de 2009 11:10
  • exato, apartir do multiplo, apos 10, 20, etc começa a ganhar!
    terça-feira, 24 de novembro de 2009 11:12
  • Bom Dia,

    Sem trigger e sem job como o cupom será calculado ? Você quer apenas visualizar a quantidade de cupons devidos em uma consulta ? Eles não serão armazenados ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!814.entry
    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 24 de novembro de 2009 11:15
  • sim serão, observe que a "Tabela1" é uma nova tabela onde ficara as informações dos clientes:

    Nome: Fulano
    Prudutos: 10
    Cupons: 1
    terça-feira, 24 de novembro de 2009 11:17
  • Opa,

    Você vai ter que usar o FLOOR, para o arredondamento.

    SELECT Clientes, FLOOR(Produtos / 10)
    FROM Tabela1


    Com ele vai ter que jogar o dado em uma coluna com a quantidade de cupons.


    Abraço!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    terça-feira, 24 de novembro de 2009 11:31
  • Opa,

    Você vai ter que usar o FLOOR, para o arredondamento.

    SELECT Clientes, FLOOR(Produtos / 10)
    FROM Tabela1


    Com ele vai ter que jogar o dado em uma coluna com a quantidade de cupons.


    Abraço!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.

    então, isso é dificil para mim ^^ eu não sei fazer isso, consegui chegar ao codigo postado acima atraves de um amigo, e esta caindo direitinho, porem falta a parte de calcular quantos cupons ganhara
    terça-feira, 24 de novembro de 2009 11:33
  • Opa,

    Na real, esse cálculo já te dá a quantidade de cupons, baseado na quantidade de produtos q o cara comprou.


    Onde está o problema? Como você quer usar? Qual a forma esperada para o resultado?


    Abraço!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    terça-feira, 24 de novembro de 2009 11:48
  • Bom dia, veja se este exemplo te ajuda:

     

    USE TEMPDB
    GO
    
    
    -- CRIANDO TABELA TEMPORÁRIA
    DECLARE @tb TABLE (Cliente VARCHAR(30), Produtos INT)
    
    
    -- POPULANDO A TABELA TEMPORÁRIA
    DECLARE @I INT; SET @I = 1;
    SET NOCOUNT ON;
    WHILE (SELECT COUNT(*) FROM @tb) != 500
    BEGIN
    	IF @I < 276 
    	    INSERT INTO @TB (Cliente,Produtos)VALUES ('Leonardo Marcelino',1)
    	ELSE
    	    INSERT INTO @TB (Cliente,Produtos)VALUES ('SkyDark',1)
    	    
    	SET @I = @I + 1
    END
    
    -- Select final calculando os cupons
    SELECT 
        Cliente          AS NomeCliente, 
        SUM(Produtos)    AS QtdProdutos, 
        SUM(Produtos)/10 AS Cupons 
    FROM 
        @TB 
    GROUP BY 
        Cliente

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    terça-feira, 24 de novembro de 2009 12:46
  • wowwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

    SO ME RESTA A AGRADECER A VOCÊS, AMOS VOCÊS DO CORAÇÃO "NÃO SOU GAY"

    O QUE FIZ:

    Peguei o Anterior:

    Delete Loja
    INSERT INTO Tabela1 (Clientes,Produtos)
    SELECT Clientes, sum(Produtos) as Produtos FROM Balcão1 Group by Clientes

    Pronto, a "Tabela1" agora contem o "Nome" e a Soma dos "Produtos"

    Agora Gerando os Cupons:

    Delete Cupons
    INSERT INTO Cupons (Clientes,Produtos)
    SELECT Clientes, FLOOR(Produtos/ 10) FROM Tabela1


    Tudo pronto, agora apenas mudarei minha aplicação para pegar o Resultado em tabela "Cupons"

    Mesmo ele Pegando os Produtos Anteriores vendidos, agora farei uma copia do Banco de Dados e mando zerar todos os produtos Vendidos, apos isso faço uma pequena soma entre os Produtos no fim da Promoção!

    Abraços mesmo!!!!!!!
    • Sugerido como Resposta Fernanda Simões quinta-feira, 26 de novembro de 2009 13:24
    terça-feira, 24 de novembro de 2009 14:23
  • Vishhh

    Agora apareceu um problema maior ainda, bem maior:

    Delete Cupons
    INSERT INTO Cupons (Clientes,Produtos)
    SELECT Clientes, FLOOR(Produtos/ 10) FROM Tabela1


    O Cliente vai efetuar uma compra, o sistema coleta da tabela "Cupons" os premios e ele tem 10, ele usa os 10, apos 1 minuto "usando JOB" ela da a ele novamente 10 Cupons :(

    Agora me perdi de vez...

    Alguma LUZ ????
    terça-feira, 24 de novembro de 2009 15:36
  • Opa...

    Olha... uma idéia manter uma coluna com a quantidade de Cupons que o cara tem, e outra com "Cupons USADOS". Na hora de mostrar quantos ele tem, vai ter que fazer o SALDO = CUPONS - "CUPONS USADOS".

    Resolve??



    Abraço!!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    terça-feira, 24 de novembro de 2009 16:46
  • Opa...

    Olha... uma idéia manter uma coluna com a quantidade de Cupons que o cara tem, e outra com "Cupons USADOS". Na hora de mostrar quantos ele tem, vai ter que fazer o SALDO = CUPONS - "CUPONS USADOS".

    Resolve??



    Abraço!!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.

    pode fazer isso pra mim ? é muito importante que eu consiga fazer o mais rapido possivel, bati cabeça aki e não consegui

    quando essa instrução passa:

    Delete Cupons
    INSERT INTO Cupons (Clientes,Produtos)
    SELECT Clientes, FLOOR(Produtos/ 10) FROM Tabela1


    ela não escreve nada na tabela que não esteja nessas 3 linhas, qualquer instrução que eu coloque abaixo não ta indo :(

    exemplo:

    Delete Cupons
    INSERT INTO Cupons (Clientes,Produtos)
    SELECT Clientes, FLOOR(Produtos/ 10) FROM Tabela1

    Update Cupons
    Set CuponsUsados = Cupons - 1





    não da certo de forma alguma :(
    terça-feira, 24 de novembro de 2009 18:42
  • Opa,

    Na verdade, o primeiro passo vai ser tirar aquele DELETE Cupons. A lógica que você terá que usar é a seguinte:

    Executar um job de tempos em tempos, esse job vai:
    - Inserir registros para cliente que ainda não existem nesta tabela
    - Atualizar cupons para aqueles que já existem nesta tabela

    Quando o cliente "usar" algum cupom, registrar essa quantidade numa coluna de CuponsUsados
    Quando for exibir a quantidade de cupons disponíveis, fazer o SALDO

    Olha... a idéia é essa.


    Abraço

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    quarta-feira, 25 de novembro de 2009 12:09
  • Opa,

    Na verdade, o primeiro passo vai ser tirar aquele DELETE Cupons. A lógica que você terá que usar é a seguinte:

    Executar um job de tempos em tempos, esse job vai:
    - Inserir registros para cliente que ainda não existem nesta tabela
    - Atualizar cupons para aqueles que já existem nesta tabela

    Quando o cliente "usar" algum cupom, registrar essa quantidade numa coluna de CuponsUsados
    Quando for exibir a quantidade de cupons disponíveis, fazer o SALDO

    Olha... a idéia é essa.


    Abraço

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.


    Eis o problema parceiro, eu sou muito fraco nessa area, muito mesmo, cheguei ate aki nos trancos...

    Vou ter que fazer a contagem de Cupons manualmente :(

    Obrigados a todos que se empenharam em ajudar, obrigado mesmo!
    quarta-feira, 25 de novembro de 2009 13:38
  • Pessoal, voltando novamente ^^ não posso desistir disso, preciso disso quanto antes possivel, para resolver o problema estou tentando usar essa TRIGGER:

    CREATE TRIGGER [ChecadorDeCreditos] ON [dbo].[CreditosFinal] 
    FOR INSERT, UPDATE, DELETE 
    AS
    
    -- Aki ele coloca o Checador com a mesma quantidade de creditos que o cliente pode ter
    UPDATE CreditosFinal 
    SET CreditosCheck = Saldo WHERE CreditosCheck < Saldo
    
    -- Aki as condições no qual o Cliente ganhara 1 Crédito a cada X Produtos
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('10')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('20')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('30')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('40')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('50')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('60')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('70')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('80')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('90')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('100')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('110')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('120')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('130')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('140')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('150')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('160')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('170')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('180')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('190')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('200')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('210')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('220')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('230')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('240')
    UPDATE CreditosFinal SET Saldo = Creditos + 1,  CreditosCheck = CreditosCheck + 1 WHERE CreditosCheck = ('250')

    Observem que quando ele dar 1 Credito ao Cliente, automaticamente o CreditosCheck sera Maior, assim o Script não da Creditos Infinitos a cada Execução, pois Saldo sera atualizado pela TRIGGER e não pela JOB, porem aparece um problema la no inicio, simplesmente a TRIGGER não preenche nada se eu coloco todo esse código, ela não segue apos a linha la no inicio vejam:

    UPDATE CreditosFinal
    SET CreditosCheck = Saldo WHERE CreditosCheck < Saldo


    ela não roda, se eu coloco:

    UPDATE CreditosFinal
    SET CreditosCheck = Saldo


    ela funciona, só que fica da mesma forma, em 1 em 1 minuto a JOB roda e atualiza a tabela, a TRIGGER vem em seguida e Coloca Saldo = Creditos
    Ae volto a estaca "0"


    Alguem ???
    quarta-feira, 25 de novembro de 2009 21:09
  • Alguem pode me ajudar a Resolver essa Trigger ?


    :(
    sexta-feira, 27 de novembro de 2009 21:58
  • Skydark,

         A sua alternativa com jobs não funciona se a cada execução, ele não souber que já executou anteriormente. Acho que a melhor alternativa é o uso simples de triggers, sem jobs.
    MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008
    sábado, 28 de novembro de 2009 18:06
    Moderador
  • Skydark,

         A sua alternativa com jobs não funciona se a cada execução, ele não souber que já executou anteriormente. Acho que a melhor alternativa é o uso simples de triggers, sem jobs.
    MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008
    pow amigo, eu inteiramente fraco nesse assunto, nem ao menos sei como consegui chegar no que ja tenho :( infelismente não posso fazer, não sou capacitado! Poderia me ajudar ? creio que com um pequeno gasto de seu precioso tempo consiga :) Não tenho alternativas mesmo, caso não poder me ajudar, me indique a um Profissional da Area, estou no disispero de ate ter que pagar por essa solução! Grato...
    sábado, 28 de novembro de 2009 18:13