SELECT
q.NumAtCard,
q.ItemCode,
MAX(q.U_SaleContNo) AS U_SaleContNo,
MAX(q.U_PONum) AS U_PONum,
SUM(q.报价单数量) AS 报价单总数量,
COALESCE(SUM(d.到货数量), 0) AS 到货总数量,
COALESCE(SUM(r.退货数量), 0) AS 退货总数量,
COALESCE(SUM(c.贷项数量), 0) AS 贷项总数量,
COALESCE(SUM(d.到货数量), 0)
- COALESCE(SUM(r.退货数量), 0)
- COALESCE(SUM(c.贷项数量), 0) AS 到货数量,
SUM(q.报价单数量)
- COALESCE(SUM(d.到货数量), 0)
+ COALESCE(SUM(r.退货数量), 0)
+ COALESCE(SUM(c.贷项数量), 0) AS 在途数量
FROM (
SELECT
n.NumAtCard,
n1.U_SaleContNo,
n1.U_PONum,
n1.ItemCode,
SUM(n1.Quantity) AS 报价单数量,
CASE
WHEN n1.U_SaleContNo IS NOT NULL THEN 'SALE'
WHEN n1.U_PONum IS NOT NULL THEN 'PO'
ELSE 'NONE'
END AS LinkType
FROM SINO_SAP.dbo.OPQT n
LEFT JOIN SINO_SAP.dbo.PQT1 n1 ON n.DocEntry = n1.DocEntry
LEFT JOIN SINO_SAP.dbo.OUDP p ON n1.U_Department = p.Name
WHERE n.CANCELED = 'n'
AND p.Remarks = '经销体系'
AND COALESCE(n.NumAtCard, n1.U_PurContNo) IS NOT NULL
AND n.DocDate >= '2024-01-01'
GROUP BY n.NumAtCard, n1.U_SaleContNo, n1.U_PONum, n1.ItemCode
) q
LEFT JOIN (
SELECT
n.NumAtCard,
n1.U_SaleContNo,
n1.U_PONum,
n1.ItemCode,
SUM(n1.Quantity) AS 到货数量,
CASE
WHEN n1.U_SaleContNo IS NOT NULL THEN 'SALE'
WHEN n1.U_PONum IS NOT NULL THEN 'PO'
ELSE 'NONE'
END AS LinkType
FROM SINO_SAP.dbo.OPDN n
LEFT JOIN SINO_SAP.dbo.PDN1 n1 ON n.DocEntry = n1.DocEntry
LEFT JOIN SINO_SAP.dbo.OUDP p ON n1.U_Department = p.Name
WHERE n.CANCELED = 'n'
AND p.Remarks = '经销体系'
AND COALESCE(n.NumAtCard, n1.U_PurContNo) IS NOT NULL
AND n.DocDate >= '2024-01-01'
GROUP BY n.NumAtCard, n1.U_SaleContNo, n1.U_PONum, n1.ItemCode
) d ON q.NumAtCard = d.NumAtCard
AND q.ItemCode = d.ItemCode
AND (
(q.LinkType = 'SALE' AND d.LinkType = 'SALE' AND q.U_SaleContNo = d.U_SaleContNo)
OR (q.LinkType = 'PO' AND d.LinkType = 'PO' AND q.U_PONum = d.U_PONum)
OR (q.LinkType = 'NONE' AND d.LinkType = 'NONE')
)
LEFT JOIN (
SELECT
n.NumAtCard,
n1.U_SaleContNo,
n1.U_PONum,
n1.ItemCode,
SUM(n1.Quantity) AS 退货数量,
CASE
WHEN n1.U_SaleContNo IS NOT NULL THEN 'SALE'
WHEN n1.U_PONum IS NOT NULL THEN 'PO'
ELSE 'NONE'
END AS LinkType
FROM SINO_SAP.dbo.ORPD n
LEFT JOIN SINO_SAP.dbo.RPD1 n1 ON n.DocEntry = n1.DocEntry
LEFT JOIN SINO_SAP.dbo.OUDP p ON n1.U_Department = p.Name
WHERE n.CANCELED = 'n'
AND p.Remarks = '经销体系'
AND COALESCE(n.NumAtCard, n1.U_PurContNo) IS NOT NULL
AND n.DocDate >= '2024-01-01'
GROUP BY n.NumAtCard, n1.U_SaleContNo, n1.U_PONum, n1.ItemCode
) r ON q.NumAtCard = r.NumAtCard
AND q.ItemCode = r.ItemCode
AND (
(q.LinkType = 'SALE' AND r.LinkType = 'SALE' AND q.U_SaleContNo = r.U_SaleContNo)
OR (q.LinkType = 'PO' AND r.LinkType = 'PO' AND q.U_PONum = r.U_PONum)
OR (q.LinkType = 'NONE' AND r.LinkType = 'NONE')
)
LEFT JOIN (
SELECT
n.NumAtCard,
n1.U_SaleContNo,
n1.U_PONum,
n1.ItemCode,
SUM(n1.Quantity) AS 贷项数量,
CASE
WHEN n1.U_SaleContNo IS NOT NULL THEN 'SALE'
WHEN n1.U_PONum IS NOT NULL THEN 'PO'
ELSE 'NONE'
END AS LinkType
FROM SINO_SAP.dbo.ORPC n
LEFT JOIN SINO_SAP.dbo.RPC1 n1 ON n.DocEntry = n1.DocEntry
LEFT JOIN SINO_SAP.dbo.OUDP p ON n1.U_Department = p.Name
WHERE n.CANCELED = 'n'
AND p.Remarks = '经销体系'
AND COALESCE(n.NumAtCard, n1.U_PurContNo) IS NOT NULL
AND n.DocDate >= '2024-01-01'
GROUP BY n.NumAtCard, n1.U_SaleContNo, n1.U_PONum, n1.ItemCode
) c ON q.NumAtCard = c.NumAtCard
AND q.ItemCode = c.ItemCode
AND (
(q.LinkType = 'SALE' AND c.LinkType = 'SALE' AND q.U_SaleContNo = c.U_SaleContNo)
OR (q.LinkType = 'PO' AND c.LinkType = 'PO' AND q.U_PONum = c.U_PONum)
OR (q.LinkType = 'NONE' AND c.LinkType = 'NONE')
)
WHERE q.LinkType <> 'NONE'
GROUP BY q.NumAtCard, q.ItemCode
HAVING SUM(q.报价单数量)
- COALESCE(SUM(d.到货数量), 0)
+ COALESCE(SUM(r.退货数量), 0)
+ COALESCE(SUM(c.贷项数量), 0) > 0;
这个代码是可以的,现在还要增加一个功能,功能就是到货数据回填,因为我们已经计算出来到货数量了,并且通过n.NumAtCard, n1.U_SaleContNo, n1.U_PONum, n1.ItemCode可以确定对应的是pqt1的那一行,PQT1这一行还有一个U_ArrQty字段,需要将到货数量回填到这个字段中,现在我能想到的问题就是到货数量可能比本身这一行的n1.Quantity要多,这种情况下,代表这个单据还有一行相同的n.NumAtCard, n1.U_SaleContNo, n1.U_PONum, n1.ItemCode,需要将到货数量拆分写入到U_ArrQty,要注意我们现在在计算到货数量的时候,报价单数量使用的临时表q,用了分组聚合,回填的时候不可以聚合,可以通过oqt1的linenum记录具体写入了哪一行
最新发布