1

私はテーブルに次のデータを持っています。

州 P_Name 製品 Apr-2013 May-2013 May-2013 Jun-2013 July-2013 Aug-2013 Sep-2013 Oct-2013 Nov-2013 Dec-2013 Jan-2014 Feb-2014 Mar-2014
================================================== ================================================== ================================================== =========
s1 p1 pro1 1500 4587 5245 6541 9683 45878 65464 4444 4411 21452 223322 232322
s1 p1 pro2 1500 4587 5245 6541 9683 45878 65464 4444 4411 21452 223322 232322

最初の 3 つの列は静的ですが、値は動的で、残りの column_names と値は動的です。これには変数があります

Declare @MONTHS INT
SET @MONTHS = 1--3/6/12 can be 1/3/6/12 as monthly/quater/half-year/fullyear

ここで、i の値に応じて、@MONTHS1 番目/1 番目から 3 番目/1 番目から 6 番目/1 番目から 12 番目の列に値を追加し、その列のみを表示する必要があります。もしも

SET @MONTHS = 1

上記のデータは結果です。しかし

SET @MONTHS = 3

次に、望ましい結果は次のとおりです。

州 P_Name 製品 Jun-2013 Sep-2013 Sep-2013 Dec-2014 Mar-2014
================================================== =====================
s1 p1 pro1 11332 62102 74319 477096
s1 p1 pro2 11332 62102 74319 477096

ここでは、2013 年 4 月、2013 年 5 月、2013 年 6 月の列の値 (2013 年 6 月の列) が追加された 3 番目の月の列のみが表示されます。月の列数と行数は動的です。月の列の数は、1/3/6/12 の倍数にすることができます。これには助けが必要です。ありがとう。

編集: 上記のテーブル データは、PIVOT を使用して別のテーブルから派生します。ループなしでPIVOTの前/と一緒に可能ですか..? 以下はPIVOT前のデータです。

州 p_name 商品金額 monthnames
================================================
s1 p1 pro1 1500 2013 年 4 月
s1 p1 pro1 4587 2013 年 5 月
s1 p1 pro1 5245 2013 年 6 月
等々................
...................................
4

1 に答える 1

1

これで済むと思ってください。派生列に列名を追加するのは少し難しいかもしれませんが、可能だと思います。列数が の倍数でない場合は、例外処理も必要です@month。私は自分のテーブルに電話しましたStates

declare @month int
set @month = 3

declare cur cursor for 
select name
  from syscolumns
 where object_name(id) = 'States'
   and colorder > 3
 order by colorder

declare @count int, @col varchar(100), @sql varchar(max), @tmp varchar(max)

set @count = 1
set @sql = 'select State, P_Name, Product, 0'
set @tmp = ''

open cur
fetch cur into @col
while @@FETCH_STATUS = 0 begin
    set @tmp = @tmp + '+' + @col
    if @count = @month begin
        set @sql = @sql + @tmp + ', 0'
        set @tmp = ''
        set @count = 0
    end

    set @count = @count + 1

    fetch cur into @col
end

set @sql = substring(@sql, 1, len(@sql) - 3) + ' from States'

exec(@sql)

close cur
deallocate cur
于 2013-10-21T13:29:29.843 に答える