2017-09-08 2 views
1

の開始日から終了日を導出する(私はそれを少し単純化)どのように私はこの「美しい」のクエリを持っている他のSQLライン

(申し訳ありませんが、私はできない私のような結果を与える
select B.IQID, B.NAME, A.IQID, A.START_DATE, NULL as A.END_DATE, CODE, VALUE 
from TABLE A 
join OTHERTABLE B on A.PORTFOLIO = B.IQID 
cross apply (
    values 
    ('TRANSOP', A.METANUM1), 
    ('CROIS', A.METANUM2), 
    ('QUALMAT', A.METANUM3) 
) as c (CODE, VALUE) 
order by 1,6,4 desc 

テーブルを作成していると思われます)。

B.IQID | B.NAME | A.IQID | START_DATE | END_DATE | CODE | VALUE  
1  eResearch  A  2017-08-31  NULL  CROIS  0,0001  
1  eResearch  B  2017-06-30  NULL  CROIS  32,2  
1  eResearch  C  2017-03-31  NULL  CROIS  0  
1  eResearch  D  2015-12-31  NULL  CROIS  70  
1  eResearch  E  2017-03-31  NULL  QUALMAT  100  
1  eResearch  F  2015-12-31  NULL  QUALMAT  20  
1  eResearch  G  2017-03-31  NULL  TRANSOP  0  
1  eResearch  H  2015-12-31  NULL  TRANSOP  10  
2  Technology  I  2015-12-31  NULL  CROIS  70  
2  Technology  J  2017-08-31  NULL  QUALMAT  0  
2  Technology  K  2015-12-31  NULL  TRANSOP  10 

ここでわかるように、END_DATEという名前の列は追加されていますが、空です。 この表で必要なレポート作成のために、end_dateに値を設定する必要があります。

このend_dateは、「次の」行の開始日から1日を引いたものとします。 しかし、 "次の"行は、実際に同じB.IQIDと同じCODEの最新の行であり、END_DATEが適用されない場合はNULLを残しています。

私はこの結果を取得したいと思う明確にする:それはMSSQLに可能と思われる何か

B.IQID | B.NAME | A.IQID | START_DATE | END_DATE | CODE | VALUE  
1  eResearch  A  2017-08-31  NULL  CROIS  0,0001  
1  eResearch  B  2017-06-30  2017-08-30 CROIS  32,2  
1  eResearch  C  2017-03-31  2017-06-29 CROIS  0  
1  eResearch  D  2015-12-31  2017-03-30 CROIS  70  
1  eResearch  E  2017-03-31  NULL  QUALMAT  100  
1  eResearch  F  2015-12-31  2017-03-30 QUALMAT  20  
1  eResearch  G  2017-03-31  NULL  TRANSOP  0  
1  eResearch  H  2015-12-31  2017-03-30 TRANSOP  10  
2  Technology  I  2015-12-31  NULL  CROIS  70  
2  Technology  J  2017-08-31  NULL  QUALMAT  0  
2  Technology  K  2015-12-31  NULL  TRANSOP  10 

ですか? ありがとうございます!

+0

ここに情報を追加するだけです。例のために、IQIDは1、2、...またはA、B、C ...を使用しましたが、実際にはこれらは35個のランダムなキャラクターの英数字チャンクです9368C1BFEB4D424C9ADBF7CD007274D0 – NessaC

答えて

0

LAG機能をチェックアウト:https://docs.microsoft.com/en-us/sql/t-sql/functions/lag-transact-sql

ます。また、その後b.start_dateを取り、a.name = b.name AND a.iqid = b.iqid + 1、自体にテーブルを結合することができ - 1日( dateaddのMSSQL構文ではわかりません)。

+0

LAG関数すぐに、ありがとう! 私の例はミスリーディングですが、私のIQIDはノートの数が増えているので(35個のランダムなキャラクターの英数字チャンクのように)、IQID + 1は使えませんのでご了承ください。 – NessaC

+0

元のクエリ。 RANK()OVER(PARTITION BY b.name ORDER BY START_DATE)を使用してください。しかし、ええ、LAGはおそらく良い答えです。 – ScottieB

+0

非常にシンプルなので、最初のクエリをCTEに入れて(オーダーを差し引いたもの)、次のように追加しました。 'LAG(START_DATE-1,1、null)を超えていますOVER(PARTITION by B.IQID、CODE ORDER BY START_DATE desc)AS END_DATE、* CTE から注文2,7,5 desc もう一度お手伝いをしていただきありがとうございます。 – NessaC

関連する問題