0

Stimulsoftレポートで使用するSQLステートメントの現在の日付から12か月前に戻すことができません。SQLテーブルの構造はこれです(図1)。imbrazilianであるため、カルチャはpt-BR(dd / mm / yyyy)に設定されていることに注意してください。

これはSQLテーブルです

http://img534.imageshack.us/img534/1093/clipboard02xva.jpg

これを作成したいのですが、過去12か月の現在の日付は2013年1月2日なので、次のようになります。

| DACP_Id | FEB 2012 | MAR 2012 | ABR 2012 ... | FEB 2013

...そして2013年2月に戻るすべての月。ピボットテーブルの月内の行は、現在の月のDACP_Valueです。

私はSQLを初めて使用するので、お役に立てば幸いです:)ありがとうございます。

4

2 に答える 2

1

限られたサンプルデータから、DACP_Idが複数の行と日付で繰り返されるかどうかを判断するのは困難です。ただし、PIVOTいつでも変更できる日付または日付の数が不明な場合は、動的SQLを使用する必要があります。

コードは次のようになります。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(DateName(month, DACP_date) +'_'+cast(Datepart(year, DACP_Date) as varchar(10))) 
                    from yourtable  
                    group by Datepart(month, DACP_date), Datepart(year, DACP_Date), DACP_date
                    order by DACP_date
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query 
    = 'select DACP_id, '+@cols+'
       from
       (
         select DACP_id, 
            DateName(month, DACP_date) +''_''+cast(Datepart(year, DACP_Date) as varchar(10)) date, 
            DACP_Value 
         from yourtable
       ) p
       pivot
       (
          sum(DACP_Value)
          for date in('+@cols+')
       ) piv'

execute(@query)

SQL FiddlewithDemoを参照してください

デモからわかるようDACP_IDに、サンプルデータでが異なるため、その月に複数の行が表示されます。しかし、これは、事前に値を知らなくてもピボットできる方法です。

于 2013-02-01T12:01:07.430 に答える
0

動的ピボットを使用せず、アプリケーションコードのヘッダーを処理する傾向があります。

WITH Data AS
(   SELECT  DACP_ID,
            DACP_Value,
            [MonthNum] = 12 - DATEDIFF(MONTH, DACP_Date, CURRENT_TIMESTAMP)
    FROM    T
    WHERE   DATEDIFF(MONTH, DACP_Date, CURRENT_TIMESTAMP) BETWEEN 0 AND 12
)   
SELECT  *
FROM    Data
        PIVOT
        (   SUM(DACP_Value)
            FOR MonthNum IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
        ) pvt;

そのままのColumnsヘッダーが本当に必要な場合は、次を使用します。

DECLARE @Col NVARCHAR(MAX) = 
    (   SELECT  ', ' + QUOTENAME(CONVERT(VARCHAR, DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) - (12 - Number), 0), 112)) + ' = [' + CAST(number AS VARCHAR) + ']'
        FROM    Master..spt_values
        WHERE   Type = 'P'
        AND     number BETWEEN 0 AND 12
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)');


DECLARE @SQL NVARCHAR(MAX) = 
        N'WITH Data AS
        (   SELECT  DACP_ID,
                    DACP_Value,
                    [MonthNum] = 12 - DATEDIFF(MONTH, DACP_Date, CURRENT_TIMESTAMP)
            FROM    T
            WHERE   DATEDIFF(MONTH, DACP_Date, CURRENT_TIMESTAMP) BETWEEN 0 AND 12
        )   
        SELECT  DACP_ID' + @Col + '
        FROM    Data
                PIVOT
                (   SUM(DACP_Value)
                    FOR MonthNum IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
                ) pvt;';

EXECUTE SP_EXECUTESQL @SQL;

日付をvarcharに変換するときに値112をさまざまな数値に変更して、列ヘッダーの日付の形式を変更できます(103は、質問に記載されているようにdd / mm / yyyyを示します)。


SQLフィドル(@bluefeetから恥知らずに盗まれ、答えに私を打ち負かしました)。この回答はここに残しましたが、テーブルにその月のデータが存在するかどうかに関係なく、13列(昨年と当月)が提供されるため、少し異なります。

于 2013-02-01T12:04:10.860 に答える