2016-11-30 80 views
1

我想知道在SQL中是否可能只显示一行,然后当该行中的值更改时还显示另一行。例如,我有一张费用表。费用可以添加到订单中。当已经添加的费用,更改了费用数量时,原始费用行标记为删除,新的费用行添加新的数量。完成此修订后,旧数量将标记为DeletedUnverified(StatusId 20),并且新费用数量行将处于Paid(StatusId 7)状态。然后,主管必须验证这些费用更改,因此一旦他们这样做,'deletedUnverified'行的状态将更改为已删除(StatusId 18),新的费用数量行将保持与Paid相同。SQL根据另一行中的值更改而显示多行

enter image description here

上面的图象显示的费用,他们改变了第一时间(顶部两行)和主管后已经验证了变化(底部两行)。前两行是数据验证之前的数据(因此statusId = 20是DeletedUnverified)。一旦管理员确定,状态将变为18(已删除)。我想要做的是收费没有得到验证时,只显示一个。所以在上面的图片中,顶部行,我只想显示行ID 111(StatusId 20)。一旦费用得到验证,我想要显示两行,即上面的两行。

我有代码显示statusID 20行,然后当它更新到状态ID 18,它只显示StatusId 7行,但我不能得到我想要的。我希望这是有道理的。

SELECT 
    * 
FROM 
    FeeItem sub1 
INNER JOIN (
    SELECT 
     ISNULL(b.feeitemid, a.itemid) AS pharmacyformfeeitemid 
    FROM 
     (
      SELECT 
       * 
      FROM 
       FormFeeItem 
      WHERE 
       OrderId IN (1234) 
      AND StatusId = 7 
     ) a 
    LEFT JOIN (
     SELECT 
      * 
     FROM 
      FormFeeItem 
     WHERE 
      OrderId IN (1234) 
     AND StatusId = 20 
    ) b ON a.OrderId = b.OrderId 
) sub2 ON sub1.FeeItemId = sub2.feeitemid 

任何帮助表示赞赏...在此先感谢:)

回答

0
DECLARE @r AS TABLE 
(
    ID INT 
    ,StatusId INT 
    ,OrderId INT 
    ,Cost MONEY 
    ,NoOfFees INT 
) 

INSERT INTO @r 
VALUES 
    (111, 20, 1234, -1.2, 3) 
    ,(123, 7, 1234, 2.4, 6) 

SELECT r1.* 
FROM @r AS r1 
LEFT JOIN @r AS r2 
    ON r1.OrderId = r2.OrderId 
    AND r2.StatusId = 18 
WHERE (r1.StatusId = 7 AND r2.ID IS NOT NULL) 
     OR 
     r1.StatusId IN (18, 20) 

DELETE @r 

INSERT INTO @r 
VALUES 
    (111, 18, 1234, -1.2, 3) 
    ,(123, 7, 1234, 2.4, 6) 

SELECT r1.* 
FROM @r AS r1 
LEFT JOIN @r AS r2 
    ON r1.OrderId = r2.OrderId 
    AND r2.StatusId = 18 
WHERE (r1.StatusId = 7 AND r2.ID IS NOT NULL) 
     OR 
     r1.StatusId IN (18, 20) 
+0

辉煌!工作了一种享受....谢谢! :) – clueless83

相关问题