选择查询并在SQL上逐行计算

时间:2018-09-11 19:41:40

标签: sql

运动

MovementType | ItemID | qtty
============================
1            | 55     |  5 |
1            | 55     |  2 |
1            | 55     |  3 |
5            | 55     |  2 |
1            | 56     |  5 |
1            | 56     |  5 |

已售商品的类型为1,退货商品的类型为5。 我想打印收据。所以我想选择重复的商品信息,但要减去退货商品。 像这样`

MovementType | ItemID | qtty
============================
1            | 55     |  3 |
1            | 55     |  2 |
1            | 55     |  3 | 

OR

MovementType | ItemID | qtty
============================
1            | 55     |  4 |
1            | 55     |  1 |
1            | 55     |  3 |

我的查询是

SELECT DISTINCT   (ISNULL(PSM.qtty,0) - ISNULL(SM.qtty,0)) AS qtty, ItemID, --..........
FROM Movements PSM
LEFT OUTER JOIN Movements as SM on PSM.ItemID = SM.ItemID AND SM.MovementType = 5
WHERE  (PSM.ID = 1) AND (PSM.MovementType = 1) --AND ........

但是它的回报是这样的

MovementType | ItemID | qtty
============================
1            | 55     |  3 |
1            | 55     |  0 |
1            | 55     |  1 |

我有交易ID和更多列,这是咖啡馆的收据。客户可以在不同的时间购买任何东西,并且可以退还一些东西。有两张收据,第一张是供员工准备订单的(TEMP收据)。所以我无法删除重复的订单,因为数量会重复(新订单和旧订单),并且我已经对订单进行了排序,以了解首先要请求的订单。对于客户(最终收据)将包含所请求订单的重复项,但要减去包含之前已订购相同项目的任何行的退货。 因此我的查询将减去包含相同项目的所有行的返回数量,这就是问题所在。

1 个答案:

答案 0 :(得分:0)

您可以使用row_number(),然后进行汇总:

select (case when sum(case when movementType = 1 then qtty
                           when movementType = 5 then - qtty
                      end) >= 0
             then 1 else 5
        end) as movementType,
       itemId,
       sum(case when movementType = 1 then qtty
                when movementType = 5 then - qtty
           end) as qtty
from (select m.*,
             row_number() over (partition by itemId, movementType order by itemId) as seqnum
      from movements m
     ) m
group by itemId, seqnum;

也就是说,我认为收据会更清晰,并有单独的退货行。