2016-10-12 1 views
-1

私は、ビューにしたいと思っているぎこちないデータセットを持っています。これを処理するストアドプロシージャを作成しましたが、私が意図したようにCrystal Reports内で使用することはできません。特定のデータの位置を見つけて新しい値を割り当てます。

ここに、問題のデータセットの例を示します。私が何をしたいか

SalesOrder Item  Qty Comment     SalesOrderLineNo 
12345   4321  1        1 
12345   4322  3        2 
12345   4312  5        3 
12345             4 
12345             5 
12345       -----Payment Info----- 9 
12345       Payment:   $100 10 
12345       Invoiced:   $90 11 
12345       Date   10-12-16 12 
12345             13 
12346   4344  1        1 
12346   4376  3        2 
12346   4329  5        3 
12346   4567  1        4 
12346             5 
12346             6 
12346      Free Freight    7 
12346             8 
12346       -----Deposit Info----- 9 
12346       Deposit:   $400 10 
12346       Remaining:  $190 11 
12346       Date   10-10-16 12 
12348   4390  1        1 
12348       Credit Card on File  2 
12348       Call Bill on Delivery 3 
12348       ----Shipping Notes---- 4 
12348       Address     5     
12348       14356 21st ST   6     
12348       City, State Zip   7     

はどちらか「-----入金情報-----」または「-----支払い情報のテキストが含まれているSalesOrderLineNoを見つけるクエリを記述で----- "と値を割り当てます。私が非表示にする必要があるデータは、SalesOrderLineNoで始まり、SalesOrderLineNo + 3で終わります。つまり、常に4 Comment行が隠れている必要があります。それは変わるべきではありません。

ここでは、完璧に動作する単一の受注用に作成したprocを示します。私はそれが必要なすべての行を隠します。残念ながら

CREATE PROC [dbo].[uspS_SRS_RemovePaymentDetailsBOL] @SalesOrder INT 
AS 

DECLARE 
@Start AS INT 

SET @Start = (SELECT SalesOrderLineNo 
      FROM SorDetail 
      WHERE SalesOrder = @SalesOrder 
      AND Comment = '-----Payment Info-----') 

SELECT SalesOrder 
     , Comment 
     , Item 
     , Qty 
     , SalesOrderLineNo 
    FROM SalesOrderDetail 
    WHERE CAST(SalesOrder AS INT) = @SalesOrder 
    AND SalesOrderLine NOT BETWEEN @Start AND @Start + 3 
    AND NComment != '' 

ここで私は立ち往生しています。 SalesOrderLineNoが決して一貫しないことを知っている "-----支払い情報-----"と "----- Deposit Info -----"の特定のコメント行に1の値を割り当てる方法または同じ各販売注文については、以下のデータの例を参照してください

SalesOrder Item  Qty Comment     SalesOrderLineNo NewAssignedValue 
12345   4321  1        1     0 
12345   4322  3        2     0 
12345   4312  5        3     0 
12345             4     0 
12345             5     0 
12345       -----Payment Info----- 9     1 
12345       Payment:   $100 10     1 
12345       Invoiced:   $90 11     1 
12345       Date   10-12-16 12     1 
12345             13     0 
12346   4344  1        1     0 
12346   4376  3        2     0 
12346   4329  5        3     0 
12346   4567  1        4     0 
12346             5     0 
12346             6     0 
12346      Free Freight    7     0 
12346             8     0 
12346       -----Deposit Info----- 9     1 
12346       Deposit:   $400 10     1 
12346       Remaining:  $190 11     1 
12346       Date   10-10-16 12     1 
12348   4390  1        1     0 
12348       Credit Card on File  2     0 
12348       Call Bill on Delivery 3     0 
12348       ----Shipping Notes---- 4     0 
12348       Address     5     0 
12348       14356 21st ST   6     0 
12348       City, State Zip   7     0 

EDIT:?。私はデータに詳細を追加しましたが

答えて

1
Select A.* 
     ,NewAssignedValue = case when B.SalesOrder is null then 0 else 1 end 
    From YourTable A 
    Left Join (
      Select SalesOrder,SalesOrderLineNo 
       From YourTable 
       Where Comment in ('-----Payment Info-----','-----Deposit Info-----') 
      ) B on A.SalesOrder=B.SalesOrder and A.SalesOrderLineNo between B.SalesOrderLineNo and B.SalesOrderLineNo+3 
Order by SalesOrder,SalesOrderLineNo 

どちらか一方が

enter image description here

+0

を返しますを設定し、ジョン、感謝するeソリューション。私は最初の質問で何かを逃したかもしれない。私はあなたの解決策を働かせないかもしれないいくつかの新しい情報を加えました。私はテストして確認します – jdidsQAA

+0

また、私の質問の私の最初のデータセットは誤解を招いていました。私はコメントにフラグを立てようとしていません、私はデポストと支払いに関する情報を含む行番号に値を割り当てようとしています。ランダムな領域に他のコメントがあります – jdidsQAA

+0

@jdidsQAA更新された回答 –

関連する問題