0

私はテーブルを持っています:

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 年の最初の行と比較する必要があります。桁...

それが解決することを願っています。多分私はこの質問から始めるべきです。

4

2 に答える 2

1

ある年の行を前年の行と比較したくないようです。その場合はAND t1.Year = t2.Year、ビューの結合条件に追加する必要があります。

これが正しくなく、どういうわけか 2012 年が特別な年である場合は、t2.Year列をビューに追加できます。そうすれば、それを直接使用でき、再発見するために参加する必要がなくなります。

于 2013-03-11T13:05:27.383 に答える
0

さて、思ったより説明が難しいようです。以前のソリューションを使用することにしましたが、ビューとクエリではなく、すべてをストアドプロシージャに配置しました。このようにして、同じテーブルを何度も繰り返す必要はありません。皆様のご支援ありがとうございました!

于 2013-03-13T12:21:31.213 に答える