cancel
Showing results for 
Search instead for 
Did you mean: 

Query con varios where

Former Member
0 Kudos

Buenas tardes,

Tengo este query en SQL:

select ORDR.CardCode,CardName,DocNum,TaxDate,DocDueDate,sum(RDR1.Quantity*OITM.SWeight1) 'Peso pedidoKG',SUM(RDR1.DelivrdQty*OITM.SWeight1)'Peso despachadoKG',

(SUM(RDR1.DelivrdQty*OITM.SWeight1)*100)/sum(RDR1.Quantity*OITM.SWeight1) 'PorcentajeKG',OUSR.U_NAME,RDR1.itemcode,sum(RDR1.Quantity*OITM.U_PQ_VOL_NETO) 'Peso pedidoGL',

SUM(RDR1.DelivrdQty*OITM.U_PQ_VOL_NETO)'Peso despachadoGL',(SUM(RDR1.DelivrdQty*OITM.U_PQ_VOL_NETO)*100)/sum(RDR1.Quantity*OITM.U_PQ_VOL_NETO) 'PorcentajeGL'

from ORDR inner join RDR1 on ORDR.DocEntry = RDR1.DocEntry

           left join OUSR on ORDR.UserSign = OUSR.USERID

           left join OITM on RDR1.ItemCode = OITM.ItemCode

where RDR1.ItemCode like 'GR%' or RDR1.ItemCode like 'VA%' or RDR1.ItemCode like 'AC%'

group by DocNum,ORDR.CardCode,CardName,TaxDate,DocDueDate,U_NAME,RDR1.itemcode

order by DocNum

Pero al ejecutarlo retorna error por división entre cero ya que el campo OITM.U_PQ_VOL_NETO está vacio para los codigos de articulos GR y VA.

Como hago para que funcione correctamente, que asi el where cumpla con una sola condición me arroje datos, o por subconsultas?

Agradezco su ayuda ya que es urgente

Gracias

Accepted Solutions (0)

Answers (2)

Answers (2)

Former Member
0 Kudos

usa un case

case OITM.U_PQ_VOL_NETO=0 then 0 else (SUM(RDR1.DelivrdQty*OITM.U_PQ_VOL_NETO)*100)/sum(RDR1.Quantity*OITM.U_PQ_VOL_NETO) 'PorcentajeGL'

felipe_loyolarodriguez
Active Contributor
0 Kudos

Lo que puedes hacer para evitar ese problema es filtrar los campos que tienen 0 para que no se dividan

Ejemplo

Where sum(Campo)<>0

Saludos

FLR

Former Member
0 Kudos

Hola Felipe al hacer lo que me dijiste, me arroja el siguienten error:

No puede aparecer un agregado en la cláusula WHERE si no es en una subconsulta contenida en una cláusula HAVING o en una lista de selección, y siempre que la columna agregada sea una referencia externa.

Entonces lo puse asi, sin la suma del campo en el where:

select ORDR.CardCode,CardName,DocNum,TaxDate,DocDueDate,sum(RDR1.Quantity*OITM.SWeight1) 'Peso pedidoKG',SUM(RDR1.DelivrdQty*OITM.SWeight1)'Peso despachadoKG',

(SUM(RDR1.DelivrdQty*OITM.SWeight1)*100)/sum(RDR1.Quantity*OITM.SWeight1) 'PorcentajeKG',OUSR.U_NAME,RDR1.itemcode,

sum(RDR1.Quantity*OITM.U_PQ_VOL_NETO)'Peso pedidoGL',

SUM(RDR1.DelivrdQty*OITM.U_PQ_VOL_NETO)'Peso despachadoGL',(SUM(RDR1.DelivrdQty*OITM.U_PQ_VOL_NETO)*100)/sum(RDR1.Quantity*OITM.U_PQ_VOL_NETO) 'PorcentajeGL'

from ORDR inner join RDR1 on ORDR.DocEntry = RDR1.DocEntry

           left join OUSR on ORDR.UserSign = OUSR.USERID

           left join OITM on RDR1.ItemCode = OITM.ItemCode

where U_PQ_VOL_NETO<>0

group by DocNum,ORDR.CardCode,CardName,TaxDate,DocDueDate,U_NAME,RDR1.itemcode

order by DocNum

Pero solo me arroja datos para los AC porque ese campo solo se llena para ese tipo de producto.

También tengo creado este sp, pero tengo un error en los IF y no se a que se debe:

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:        <Author,,Name>

-- Create date: <Create Date,,>

-- Description:    <Description,,>

-- =============================================

CREATE PROCEDURE ind1_peds 

    -- Add the parameters for the stored procedure here

    @codigo nvarchar (16),

    @anio datetime,

    @mes datetime

AS

BEGIN

DECLARE   

    @pedKG FLOAT,

    @pedGL FLOAT,

    @descKG FLOAT,

    @descGL FLOAT,

    @desfKG FLOAT,

    @desfGL FLOAT

   

    DECLARE C_Pedidos CURSOR FOR

        SELECT DISTINCT RDR1.DocEntry, ORDR.TaxDate, ORDR.DocDueDate

        FROM RDR1, ORDR ,OCRD

        WHERE ORDR.DocEntry=RDR1.DocEntry

        AND ORDR.CardCode= @codigo AND OCRD.CardType= 'c'

        AND YEAR(ORDR.TaxDate)= @anio

        AND MONTH(ORDR.DocDueDate) = @mes

        AND ORDR.DocStatus != 'C'

        ORDER BY RDR1.DocEntry

    OPEN C_Pedidos

    FETCH NEXT FROM C_Pedidos

    INTO @pedKG,

        @pedGL,

        @descKG,

        @descGL ,

        @desfKG ,

        @desfGL

    WHILE @@FETCH_STATUS = 0

--    BEGIN

            DECLARE C_DetallePed CURSOR FOR

            SELECT RDR1.ItemCode,RDR1.Quantity

            FROM RDR1, ORDR ,OITM

            WHERE RDR1.DocEntry = ORDR.DocEntry

            AND RDR1.DocEntry = ORDR.DocEntry

        OPEN C_DetallePed

        FETCH NEXT FROM C_DetallePed

        WHILE @@FETCH_STATUS = 0

            IF SUBSTRING(RDR1.ItemCode,1,2) = 'AC'

            SET    @pedGL = @pedGL + C_Despachos.Quantity * C_Despachos.U_PQ_VOL_NETO;

            ELSE

            SET    @pedKG = @pedKG + C_Despachos.Quantity * C_Despachos.SWeight1;

            END

--            IF C_DetallePed.ItemCode = 'AC'

--            BEGIN

--                @pedKG := @pedGL + RDR1.DelivrdQty * OITM.U_PQ_VOL_NETO

--            END

--            ELSE

--            BEGIN

--                @pedKG := @pedKG + RDR1.Quantity * OITM.SWeight1;

--            END

        FETCH NEXT FROM C_DetallePed

        CLOSE C_DetallePed

        DEALLOCATE C_DetallePed

           

        DECLARE C_Despachos CURSOR FOR

            SELECT DLN1.ItemCode, DLN1.Quantity,OITM.U_PQ_VOL_NETO,OITM.SWeight1

            FROM DLN1, ODLN,ORDR,RDR1,OITM

            WHERE DLN1.DocEntry = RDR1.DocEntry

            AND ODLN.DocNum = DLN1.DocEntry

            AND ODLN.DocStatus != 'O'

            AND ODLN.TaxDate <= ORDR.DocDueDate

            AND OITM.ItemCode = DLN1.ItemCode

            GROUP BY DLN1.ItemCode, DLN1.Quantity, ODLN.DocNum

        OPEN C_Despachos

        FETCH NEXT FROM C_Despachos

        WHILE @@FETCH_STATUS = 0

        --BEGIN

            IF SUBSTRING(DLN1.ItemCode,1,2) = 'AC'

            SET    @descGL = @descGL + C_Despachos.Quantity * C_Despachos.U_PQ_VOL_NETO;

            ELSE

            SET    @descKG = @descKG + C_Despachos.Quantity * C_Despachos.SWeight1;

   

        FETCH NEXT FROM C_Despachos

--        END

        CLOSE C_Despachos

        DEALLOCATE C_Despachos

               

        DECLARE C_DespachosDetalle CURSOR FOR

        SELECT DLN1.ItemCode, DLN1.DelivrdQty,OITM.U_PQ_VOL_NETO,OITM.SWeight1,DLN1.Quantity

            FROM DLN1, ODLN, OITM

            WHERE DLN1.DocEntry= ODLN.DocEntry

            AND DocNum=DocNum

            AND DocStatus != 'O'

            GROUP BY DLN1.ItemCode,Quantity, ODLN.DocNum,DelivrdQty

        OPEN C_DespachosDetalle

        FETCH NEXT FROM C_DespachosDetalle

        WHILE @@FETCH_STATUS = 0

--        BEGIN

            SELECT DLN1.ItemCode, DLN1.DelivrdQty,OITM.U_PQ_VOL_NETO,OITM.SWeight1,DLN1.Quantity

            FROM DLN1, ODLN, OITM

            WHERE DLN1.DocEntry= ODLN.DocEntry

            AND DocNum=DocNum

            AND DocStatus != 'O'

            GROUP BY DLN1.ItemCode,Quantity, ODLN.DocNum,DelivrdQty

            IF SUBSTRING(DLN1.ItemCode,1,2) = 'AC'

            @desfGL = @desfGL + (C_DespachosDetalle.DelivrdQty * C_DespachosDetalle.OITM.U_PQ_VOL_NETO)

            ELSE

            @desfKG = @desfKG + (C_DespachosDetalle.DelivrdQty * desf.OITM.SWeight1)

        FETCH NEXT FROM C_DespachosDetalle

        CLOSE C_DespachosDetalle

        DEALLOCATE C_DespachosDetalle

        DECLARE

        @completado varchar

        BEGIN

        IF (@desfKG >= @pedKG) AND (@desfGL >= @pedGL)

            @f.PCUMP = True

            @completado = 'Si'

        ELSE

            @f.PCUMP = False

            @completado = 'No'

        END

       

        DECLARE @fechadespacho datetime

           

       SET @fechadespacho = ( SELECT MAX(ODLN.TaxDate)

            FROM ODLN, DLN1, ORDR, rdr1

            WHERE ODLN.DocEntry=RDR1.DocEntry AND ORDR.DocEntry=RDR1.DocEntry

            AND RDR1.DocEntry=ORDR.DocNum

            AND RDR1.DocEntry = C_Pedidos.DocNum)

       DECLARE

       @peKG  int = 0,

       @peGL int = 0

      

       IF @pedKG > 0

       BEGIN       

        SET    @peKG = @descKG/(@pedKG*100)           

        END

       

        IF @pedGL > 0

        BEGIN       

        SET    @peGL = @descGL/(@pedGL*100)           

        END        

       

        --Aqui van los insert en la tabla de usuario

    INSERT INTO [@PQ_IND_PEDS]

            ([Code]

           ,[Name]

           ,[U_PQ_Pedido]

           ,[U_PQ_Fecha]

           ,[U_PQ_Fecha_Compr]

           ,[U_PQ_Fecha_Entrega]

           ,[U_PQ_Pedido_KG]

           ,[U_PQ_Despachado_KG]

           ,[U_PQ_Porcentaje_KG]

           ,[U_PQ_Pedido_GL]

           ,[U_PQ_Despachado_GL]

           ,[U_PQ_Porcentaje_GL]

           ,[U_PQ_Completado]

           ,[U_PQ_Codigo_Cliente]

           ,[U_PQ_Nombre_Cliente])

     VALUES

            (Code, char(30)

           ,Name, char(30),

           c_pedidos.DocEntry, int,

           c_pedidos.TaxDate, datetime,

           c_pedidos.DocDueDate, datetime,

           @fechadespacho, datetime,

           @pedKG, ROUND(19,6),

           @descKG, ROUND(19,6),

           @peKG, ROUND(19,6),

           @pedGL, ROUND(19,6),

           @descGL, ROUND(19,6),

           @peGL, ROUND(19,6),

           @completado, char(2),

           c_pedidos.CardCode, char(20),

           c_pedidos.CardName, char(100))

            --([Code]

          -- ,[Name]

          -- ,c_pedidos.DocEntry

          -- ,c_pedidos.TaxDate

          -- ,c_pedidos.DocDueDate

          -- ,@fechadespacho

          -- ,@pedKG

           --,@descKG

          -- ,@peKG

          -- ,@pedGL

           --,@descGL

           --,@peGL

           --,@completado

           --,c_pedidos.CardCode

           --,c_pedidos.CardName   

   

        FETCH NEXT FROM C_Pedidos

    CLOSE C_Pedidos

    DEALLOCATE C_Pedidos   

Ayudame con esto porfa, es realmente urgente, me están solicitando este informe.

Te agradezco

Former Member
0 Kudos

Deberias pensar seriamente en comprar el Addon B1UP....te hace muchas validaciones sin tocar tanto codigo o hacer tanto query.....

Para lo de tu division en 0 probaste NULLIF o ISNULL o en reporting services isNAN ??

rjovel
Active Participant
0 Kudos

despues del group pon esto

having sum(Campo)<>0

asi deberia funcionarte.