2016-11-30 5 views
1

SQLでは1つの行のみを表示し、その行の値が変更されたときに別の行も表示できるかどうかは疑問でした。たとえば、私は料金表を持っています。注文に料金を追加することができます。すでに追加された手数料に手数料が変更された場合、元の手数料行は削除済みとしてマークされ、新しい手数料行に新しい数量が追加されます。この修正が行われると、古い数量はDeletedUnverified(StatusId 20)とマークされ、新しい料金数量列はPaid(StatusId 7)のステータスで入ります。管理者はこれらの料金変更を確認しなければなりません。その場合、「deletedUnverified」行のステータスは「削除済み」(StatusId 18)に変更され、新しい料金数量列はPaidと同じままになります。SQLは別の行の値の変化に基づいて複数の行を表示します

enter image description here

上記画像は、費用を、それらが変更された最初の時間(上の2行)を示し、スーパーバイザが変化(下二列)を確認した後。上の2行は、検証される前のデータです(statusId = 20はDeletedUnverifiedです)。スーパーバイザがそれを確認すると、状態は18(削除済み)に変わります。私がしようとしているのは、手数料が確認されていないときだけです。上の行の上のイメージでは、行ID 111(StatusId 20)を表示するだけです。料金が確認されたら、両方の行、つまり上の2行を表示します。

statusID 20の行を示したコードがあり、statusID 18に更新されたときにステータスID 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

関連する問題