2016-09-29 5 views
1

を適用渡り、私はSQL Server 2008でループ動作を実行する必要があります。SQL Serverの - ループのために - 下の表では

列の表のは、0から9

に値を持つことができます
For j = 0 to 9: (Iterate through the column **Day**) 
    y=0; 
    For k = 0 to 9: (Iterate through the column **Day** again) 
     if x[k] >= x[j]: y= y+1; 

表A:

Key|Day| x | y | 
---|---|----|---| 
123| 0 |7000| | 
123| 2 |6000| | 
123| 9 |6500| | 

私はクロスが適用されます使用していると、次しまっ:

select * from TableA A 
cross apply (
select Day as k, case when B.x >= A.x then 1 else 0 end as y 
from TableA B 
where A.Key = B.Key 
) C 

出力:すべてのkについてY = Y + 1を取得する方法を見つけ出すことが

Key|Day|x[j]|k |x[k]|y |y - What I need 
---|---|----|--|----|--|---------------- 
123|0 |7000|0 |7000|1 |1 
123|0 |7000|2 |6000|0 |1 
123|0 |7000|9 |6500|0 |1 
123|2 |6000|0 |7000|1 |1 
123|2 |6000|2 |6000|1 |2 
123|2 |6000|9 |6500|1 |3 
123|9 |6500|0 |7000|1 |1 
123|9 |6500|2 |6000|0 |1 
123|9 |6500|9 |6500|1 |2 

ことができません。

私はjoinを使用できません。しかし、参加のパフォーマンスがクロス・アプリケーションよりも良い場合は、ソリューションを共有してください。

助けてください。おかげ

編集:

select * from TableA A 
cross apply (
select Day as k 
,sum(case when B.x >= A.x then 1 else 0 end) over (partition by A.Key,A.Day) as y 
from TableA B 
where A.Key = B.Key 
) C 

をしかし、それは私に正しい出力を与えるものではありません: 私は条件を実行している合計を計算するには、次の試してみました。私が取得:

また
Key|Day|x[j]|k |x[k]|y |y - What I need 
---|---|----|--|----|--|---------------- 
123|0 |7000|0 |7000|1 |1 
123|0 |7000|2 |6000|1 |1 
123|0 |7000|9 |6500|1 |1 
123|2 |6000|0 |7000|3 |1 
123|2 |6000|2 |6000|3 |2 
123|2 |6000|9 |6500|3 |3 
123|9 |6500|0 |7000|2 |1 
123|9 |6500|2 |6000|2 |1 
123|9 |6500|9 |6500|2 |2 

、私はそれは私にエラーを与えるOVER句内で順序を使用する場合:

The Parallel Data Warehouse (PDW) features are not enabled. 
+0

なぜあなたは「参加」を「許可」していませんか? 「クロス適用」は、「結合」 - 横方向のクロス結合でもあります。 –

+0

悲しいことに、私はそれに明確な答えはありません。 DBは1分間に大量のトランザクションを処理します。しかし、上記の操作を実行する必要があるテーブルは1日に1回しか更新されないため、「結合」を使用するソリューションの方がうまくいく場合は、私の「上位のアップ」を説得しようとします。 – BugBug

+0

あなたはクロスジョインについて権利を行使しましたが、実行中の合計(最後の列)に悩まされています。それを検索してみてください。 – qxg

答えて

0

あなたは非常に近いです。私はSQL Server 2016を実行しています。結果は同じでなければなりません。メモ期待どおりの結果のキーと日付の列は、TableAの元のデータと一致しません。

WITH TableY AS 
(
    SELECT A.[Key], A.[Day], A.X AS xj, B.[Day] AS k, B.X AS xk, 
    (CASE WHEN B.X >= A.X THEN 1 ELSE 0 END) AS y 
    FROM @TableA AS A 
    INNER JOIN @TableA AS B ON A.[Key] = B.[Key] 
) 
SELECT *, 
    SUM(y) OVER(
     PARTITION BY [Key], [Day] 
     ORDER BY k 
     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 
    ) AS 'RunningTotalY' 
FROM TableY 
ORDER BY [Key], [Day], xj, k; 

PDWエラーの原因がわかりません。

+0

ありがとうございます。結果とデータが一致するようにTableAデータを修正しました。しかし、このコードはSQL Server 2008では動作しません.SQL Server 2012以上で動作します。ですから、@Vladimirのようなカーソルを使用しなければなりません。 – BugBug

関連する問題