这是我的输入。
| poNum | poLineNbr | poLineQty | recvEaQty | evTypeCd | cnfrmSeqNbr | localDebitCredit | cnfrmQty |
|------------|-----------|-----------|-----------|----------|-------------|------------------|----------|
| 3000773357 | 360 | 2520 | 57 | 6 | | H | |
| 3000773357 | 360 | 2520 | 336 | 6 | | H | |
| 3000773357 | 360 | 2520 | | | LA | | 66 |
| 3000773357 | 360 | 2520 | | | LA | | 32 |
| 3000773357 | 360 | 2520 | 78 | 1 | | S | |
| 3000773357 | 360 | 2520 | | | LA | | 56 |
| 3000773357 | 360 | 2520 | 72 | 1 | | S | |
| 3000773357 | 360 | 2520 | 1 | 1 | | H | |
| 3000773357 | 360 | 2520 | 17 | 1 | | H | |
| 3000773357 | 360 | 2520 | | | LA | | 4 |
这是提供给我的逻辑。
对于poNum和poLineNbr的每种组合,请按以下说明获得数量。每个poNum和poLineNbr都有一个唯一的poLineQty。
当cnfrmQty> 0且cnfrmSeqNbr = LA时,即,如果针对poNum的特定组合存在任何记录,则cnfrmQty> 0且cnfrmSeqNbr = LA的poLineNbr可以使用。
现在情况1的计算如下:
Qty = poLineQty - sum(cnfrmQty) + sum(recvEaQty where evTypeCd = 1 and localDebitCredit = H)
sum(recvEaQty ...)的条件并不取决于cfrmSeqNbr是什么。
如果针对poNum,具有cnfrmQty> 0且cnfrmSeqNbr = LA的poLineNbr的特定组合没有没有记录,则执行以下操作。
Qty = poLineQty - sum(recvEaQty where evTypeCd = 1 and localDebitCredit = S) + sum(recvEaQty where evTypeCd = 1 and localDebitCredit = H)
当cnfmQty = 0且total(recvEaQty其中evTypeCd = 1)= 0时,请执行以下操作。
Qty = poLineQty
到目前为止我所做的:
SELECT
PO.poNum,
PO.poLineNbr,
(
MIN(PO.poLineQty) -
(
SUM(CASE WHEN PO.cnfrmSeqNbr = 'LA' THEN PO.cnfrmQty ELSE 0 END) +
SUM(CASE WHEN PO.evTypeCd = 1 AND PO.localDebitCredit = 'S' THEN PO.recvEaQty ELSE 0 END) -
SUM(CASE WHEN PO.evTypeCd = 1 AND PO.localDebitCredit = 'H' THEN PO.recvEaQty ELSE 0 END)
)
) AS Qty
FROM mytable AS PO
GROUP BY PO.poNum, PO.poLineNbr
我没有期望的输出,只有逻辑。我更喜欢普通SQL中的解决方案,没有供应商特定的问题。不允许CTE /视图等。