私はテーブルを持っています:
SourceID、TargetID、Amount、Year。
私にも見方があります。このビューは、同じテーブル内の行とその上の行の違いを見ています。私はこれを行うために CTE を使用します。
WITH cte as (SELECT ROW_NUMBER() OVER
(PARTITION BY SourceID ORDER BY ... ) as rowNum,
SourceId, TargetID, Amount, Year FROM table)
Select
t1.SourceID as SourceID1,
t2.SourceID as SourceID2,
t1.TargetID as TargetID1,
t2.TargetID as TargetID2,
t1.Year,
(t1.Amount - t2.Amount) as Difference
FROM cte t1
LEFT JOIN cte t2 ON t1.SourceID = t2.SourceID and t1.rowNum = t2.rowNum+1
そのビューには2つの列があります。TargetID1 と TargetID2。TargetID2 は、上の行の TargetID1 と同じです。上記の左側の結合で条件が満たされないため、TargetID2 が null になることがあります。それは結構です。このビューから * を選択することは、まさに私が必要としているものです。
ここでの問題は、条件付きで選択したい場合です。例: 年が 2012 の行のみを選択したい。もちろん技術的にはこれは問題ではありませんが、2012 年の最初の行が 2011 年の (現在は見えなくなっている) 最後の行と比較されると、顧客は混乱します。結果セットの最初の行が結合条件を満たしている場合、差を空 (NULL) にする必要があります。
だから私はこれを書いた:
SELECT
SourceID1, SourceID2, TargetID1, TargetID2, Year,
case when TargetID2 is null
then null
else case when TargetID2 NOT IN (
select TargetID1 from view where Year = 2012)
then null
else Difference
end
end as Difference,
FROM view where Year = 2012
これは実際に機能しました...テーブルがかなり大きいため、少し時間がかかりましたが、許容範囲でした。ここで、パーセンテージ (パーセンテージの差) を追加します。これは、この最後のクエリが、まったく同じ条件をチェックする別の条件付き選択で拡張されることを意味します。
case when TargetID2 is null
then null
else case when TargetID2 NOT IN (
select TargetID1 from view where Year = 2012)
then null
else Percentage
end
end as Percentage
したがって、これは非常に消費されています。
私の質問は次のとおりです。どうすればよいですか?一般的なソリューション、ビュー、またはクエリへの変更はすべて問題ありません。フィルタリングされた結果の最初の行が差とパーセンテージとして null で表示され、クエリが実行される限り、制限はありません。
大きな投稿で申し訳ありません。他にこれを置く方法がわかりませんでした。
ありがとう
編集:
私は問題について十分に明確ではありませんでした。年が唯一の懸念事項である場合、以下の提案のいくつかを行うことができますが、そうではありません. 読みやすくするためにテーブルとビューを単純化しましたが、フィルター処理できる列やその他のものがあります。
月欄もあります。したがって、2011 年 10 月から 2012 年 2 月までを表示したい場合は、2011 年の最後の行を 2012 年の最初の行と比較する必要があります。桁...
それが解決することを願っています。多分私はこの質問から始めるべきです。