表运动
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收据)。所以我无法删除重复的订单,因为数量会重复(新订单和旧订单),并且我已经对订单进行了排序,以了解首先要请求的订单。对于客户(最终收据)将包含所请求订单的重复项,但要减去包含之前已订购相同项目的任何行的退货。 因此我的查询将减去包含相同项目的所有行的返回数量,这就是问题所在。
答案 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;
也就是说,我认为收据会更清晰,并有单独的退货行。