none
Não consigo fazer multiplicação de campos RRS feed

  • Pergunta

  • Preciso calcular a pontuação dos produtos vendidos, só que a minha tabela da vendas tem +/- 500 registros, qnd eu faço a multiplicação, me retorna mais de 300.000 registros, isto é, os registros duplicados, triplicados, quadriplicads... e assim vai...

     

    Dados:

    [tb_venda]+/- 500 registros

    id_venda --numero da venda

    Id_produto  -- identificador do produto

    qnt_venda --qntidade vendida

     

    [tb_pontuacao] todos os produtos com ID e pontuacao

    id_produto --identificador do produto

    v_ponto   -- valor de pontos do produto

     

     

    a minha query está assim

     

    Select v.qnt_venda*p.v_ponto    AS PontoVenda

    from tb_venda    v

    inner join  tb_pontuacao    p

    on v.Id_produto=p.Id_produto

     

     

     

     

    Seguindo essa lógica, era p/ o sql manter a tabela de vendas com 500 registros e me apresentar somente o valor de pontos para cada registros...

    O que acontece é triplicação de registros, a consulta fica com mais de 1500 registros.

     

    O que está havendo??

    Onde estou errando??

     

    Entedesse a minha dúvida??

     

     

     

     

    Conto com a ajuda de vcs!!!

    quinta-feira, 28 de junho de 2007 16:39

Todas as Respostas

  •  

    Marcelo,

     

    Verifique na tabela de Pontuação se existe apenas uma entrada para cada id_produto.

     

     

    Abraço

    quinta-feira, 28 de junho de 2007 17:48
  • Alexandre, obrigado pela atenção!

     

    existem vários id_produto p/ o mesmo produto, pois a pontuação muda em relação a [temporada] e [regiao]

    precisaria "bater"  estes dois campos tb??

    quinta-feira, 28 de junho de 2007 18:40
  • Eu pensei em fazer algo assim:

     

    While Not  EOF

           SELECT dd,WorkWeek,BusinessId,InvoiceNumber,ProductName,DistiId,ID_produto,SalesUnits,a from tb_temp2 where a='N'

                          x= SELECT NR_pontosProduto from TB_pontosProduto where ID_produto=ID_produto(tb_temp2)

                          y=SalesUnits

                           @calculo=x*y

     

                          update tb_temp2 set a='Y',SalesPoints=@calculo

                          where dd=dd
                          AND WorkWeek=WorkWeek
                          AND BusinessId=BusinessId
                          AND InvoiceNumber=InvoiceNumber
                          AND ProductName=ProductName
                          AND DistiId=DistiId
                          AND ID_produto=ID_produto
                          AND SalesUnits=SalesUnits
                          AND a=a
    end

     

     

    mas enm faço idéia como se faz isso dentro do sql

    se tiver q usar trigger, ai piorou!!! 8(

     

     

     

     

    quinta-feira, 28 de junho de 2007 18:57
  • Marcelo,

     

    Você pode utilizar no SQL Server um While, em último caso também poderá trabalhar com cursor.

     

    Veja os exemplos:

     

    //Criando a Tabela//

    Create Table FICHAINDICE

    (

    NumFichaIndice Int Not Null,

    NumItemFichaIndice Int Not Null,

    NumFicha Int Not Null,

    CodProd Varchar(25) Not Null,

    CodRef Varchar(10) Not Null,

    CONSTRAINT [PK_FICHAINDICE] PRIMARY KEY CLUSTERED

    (

    [NUMFICHAINDICE],

    [NUMITEMFICHAINDICE],

    [NUMFICHA])

    WITH FILLFACTOR = 95 ON [PRIMARY]) ON [PRIMARY]

    /*********************************************/

    //Criando/Alterando a Procedure//

    Alter Procedure P_MontarFichaIndice

    As

    Set NoCount On

    Declare @Contador Int,

    @Ficha Int,

    @NumFicha Int,

    @CodProd Varchar(25),

    @CodRef Varchar(10),

    @NumFichaIndice Int,

    @NumItemFichaIndice Int

    Set @Contador=0

    Set @Ficha=538

    Set @NumFicha=0

    Set @CodProd=''

    Set @CodRef=''

    Set @NumFichaIndice=26141

    Set @NumItemFichaIndice=1

    Truncate Table FichaIndice

    While @Ficha <=(Select Max(NumFicha) From Custo)

    Begin

    Select @Contador=Count(ct.CodProd),

    @CodProd=ct.CodProd,

    @NumFicha=ct.NumFicha,

    @CodRef=ctb.CodRef

    From Custo ct Inner Join CustoTab ctb

    On ct.codprod=ctb.codprod

    Where ct.numficha=@Ficha

    Group By ct.CodProd, ct.NumFicha, ctb.CodRef

    If @Ficha >= (Select Max(NumFicha) From Custo)

    Break

    Else

    Begin

    If @Contador >=1

    Begin

    Insert Into FichaIndice

    Values(@NumFichaIndice, @NumItemFichaIndice, @NumFicha, @CodProd, @CodRef)

    If (@NumItemFichaIndice) >=1 And (@NumItemFichaIndice) < 51

    Begin

    Set @NumItemFichaIndice=@NumItemFichaIndice+1

    End

    Else If @NumItemFichaIndice = 51

    Begin

    Set @NumItemFichaIndice=1

    Set @NumFichaIndice=@NumFichaIndice+1

    End

    End

    Set @Ficha=@Ficha+1

    End

    End

    /*********************************************/

    //Executando a Procedure//

    Exec P_MontarFichaIndice

    /*********************************************/

    Select * From FichaIndice

    order by numfichaIndice

     

     

     Ou

     

    DECLARE @CONTADOR INT,

    @CODSEQUENCIALPRODUTO INT

    SET @CONTADOR=1

    DECLARE NUMMP_CURSOR CURSOR FOR

    SELECT * FROM #CODSEQUENCIALPRODUTO

    OPEN NUMMP_CURSOR

    WHILE @CONTADOR <=109

    Begin

    FETCH NEXT FROM NUMMP_CURSOR

    INTO @CODSEQUENCIALPRODUTO

    UPDATE CTENTRADA_PQC_RESULTADOS

    SET CODRELACIONAMENTO = (SELECT TOP 1 PQCx.CODRELACIONAMENTO

    FROM PQCxME PQCx INNER JOIN CTENTRADA_PQC_RESULTADOS CT

    ON PQCx.CodSequencialProduto = CT.CODSEQUENCIALPRODUTO

    WHERE PQCx.CODSEQUENCIALPRODUTO=@CODSEQUENCIALPRODUTO)

    WHERE CTENTRADA_PQC_RESULTADOS.CODSEQUENCIALPRODUTO=@CODSEQUENCIALPRODUTO

     

    Set @Contador=@Contador+1

    End

    Close NumMP_Cursor

    Deallocate NumMP_Cursor

    sexta-feira, 29 de junho de 2007 15:05