on 10-04-2013 10:23 PM
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
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'
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
User | Count |
---|---|
99 | |
11 | |
11 | |
6 | |
6 | |
4 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.