4

次のようなコントラクトのトランザクションを保存するテーブルがあります。

Id_Contract[int] | Month[DateTime] | Amount[int]
------------------------------------------------
        1          2012-01-01 00:00:00.000      500     
        1          2012-03-01 00:00:00.000      450 
        2          2012-09-01 00:00:00.000      300     
        3          2012-08-01 00:00:00.000      750 

ユーザーはクエリの期間を選択できるはずです。アーカイブしたいのは、ユーザーが2012年1月から2012年3月までの期間を選択すると、結果が得られるということです。

Id_Contract[int] | Jan 2012 | Feb 2012 | Mar 2012
--------------------------------------------------
    1                   500                       450

これを解決する方法について何か提案はありますか?

よろしく、r3try

編集: これまでの回答に感謝します! 私の問題をグーグルで調べたとき、ピボットにも出くわしましたが、これまでのところ、私の問題を実際に解決する例は見つかりませんでした (基本的にすべての例が列エントリの特定の可能性を示しているためですが、私の例では「2012 年 3 月」のようになる可能性があります)。 '、'2012 年 4 月'、...、'2013 年 1 月'、...)

SQLクエリから取得した日付をどうするかについての背景情報をもう少し教えてください:契約に関するデータを含むグリッドビューを備えたasp.net Webフォームサイトを持っています...今、このテーブルはその特定のコントラクトの支払い情報によって拡張されます (基本的には Id_Contract での結合ですが、「ピボット」されています)。ユーザーが 2012 年 3 月から 2012 年 5 月を選択した場合、Gridview には、契約に関する通常のデータと、支払い情報の 3 つの列 (3 月、4 月、5 月) が含まれている必要があります。DB には、すでに値が挿入されているエントリのみが格納されます。-> 説明により、物事が少し明確になることを願っています。

4

2 に答える 2

3

あなたの問題は、動的ピボットを使用して解決できます。この記事を見てください

これを試して

DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT)
INSERT INTO @t SELECT 1,'2012-01-01 00:00:00.000',500
INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450
INSERT INTO @t SELECT 2,'2012-09-01 00:00:00.000',300
INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750

DECLARE @cols AS VARCHAR(MAX), @query  AS VARCHAR(MAX);

SELECT 
    Id_Contract
    , LEFT(DATENAME(month,Dt),3) + ' ' + DATENAME(Year,Dt) AS Month_Year_Name
    ,Amount
INTO #Temp
FROM @t 
WHERE Dt BETWEEN  '01/01/2012' AND '03/31/2012'

SELECT  @cols = STUFF(( SELECT DISTINCT 
                               '],[' +   t2.Month_Year_Name
                        FROM    #Temp AS t2
                        ORDER BY '],[' + t2.Month_Year_Name
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'

SET @query = 'SELECT Id_Contract, ' + @cols + ' FROM 
            (
                SELECT
                     Id_Contract
                    , Amount
                    , Month_Year_Name
                FROM #Temp
           ) x
            PIVOT 
            (
                 MAX(amount)
                 FOR Month_Year_Name in (' + @cols + ')
            ) p '
EXECUTE(@query)
DROP TABLE #Temp

// 結果

Id_Contract Jan 2012    Mar 2012
1           500         450

編集

テストデータについては、

DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT) 
INSERT INTO @t SELECT 1,'2012-01-01 00:00:00.000',500 
INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450 
INSERT INTO @t SELECT 2,'2012-03-01 00:00:00.000',450 
INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750 

出力は

Id_Contract Jan 2012    Mar 2012
1              500          450
2              NULL         450

要件を満たしているかどうか教えてください。

于 2012-09-05T11:16:37.803 に答える
0

やりたいことはピボットと呼ばれ、組み込み演算子PIVOTUNPIVOT関係演算子によってサポートされています。.

解決策で答えを拡張しますが、今のところ、リンクを見てください。一般的なアイデアが得られます。

于 2012-09-05T11:12:27.640 に答える