3

plsqlではなく、SQLクエリで解決する必要がある次の問題で少し迷っています。アイデアは、累積列を作成して、前のすべての月を計算することです。入力テーブルは次のようになります

 Month
 1
 2
 3
 ..
 24

次のテーブルを作成する必要があります。

Month Cum_Month
1     1
2     1
2     2
3     1
3     2
3     3
..
24    1
...
24    23

これはすべて SQL Server 2008 で行われました。よろしくお願いします

4

2 に答える 2

2

次のように実行できます。

DECLARE @tbl TABLE ([Month] INT)
INSERT @tbl VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24)


SELECT  Month
        ,   ROW_NUMBER() OVER (PARTITION BY Month ORDER BY Month) num
FROM    @tbl a
JOIN    
(
    SELECT  *
    FROM    master..spt_values 
    WHERE   type = 'P'
)
b ON b.number < a.Month

master..spt_valuesを使用して数値を生成します。数値が生成された後、サブクエリの結果が で結合され、@tblに対応する行数が取得されますmonth。その後、ROW_NUMBER各月の適切な序数を作成するために使用されます。

于 2013-01-31T08:12:27.437 に答える
1

これは、テーブルを使用しないかなりクールなトリックです。

SELECT N.Number as Month, N2.Number as Cum_Month
FROM 
   (SELECT Number FROM master..spt_values WHERE Number BETWEEN 1 AND 24 AND Type = 'P') N
   JOIN (SELECT Number FROM master..spt_values WHERE Number BETWEEN 1 AND 24 AND Type = 'P') N2 ON N.Number >= N2.Number
ORDER BY N.Number, N2.Number

そしてフィドル

そして、最後の24 24が本当に必要ない場合は(なぜそうしないのか)、2番目のクエリを1から23の間に変更するだけです。

于 2013-01-31T08:17:22.670 に答える