如何在本机SQL中的不同情况下进行汇总?

时间:2019-01-31 08:55:00

标签: mysql sql

这是我的输入。

| 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。

情况1:

当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是什么。

情况2:

如果针对poNum,具有cnfrmQty> 0且cnfrmSeqNbr = LA的poLineNbr的特定组合没有没有记录,则执行以下操作。

Qty = poLineQty - sum(recvEaQty where evTypeCd = 1 and localDebitCredit = S) + sum(recvEaQty where evTypeCd = 1 and localDebitCredit = H)

情况3:

当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 /视图等。

SQL Fiddle for data

0 个答案:

没有答案