2011-07-26 11 views
0

のは、このようなクエリを考えてみましょう:グループ化列

SELECT * 
FROM (
SELECT 
YEAR(OrderDate) [Year], 
MONTH(OrderDate) [Month], 
SubTotal 
FROM Sales.SalesOrderHeader 
) TableDate 
PIVOT (
SUM(SubTotal) 
FOR [Month] IN (
    [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] 
) 
) PivotTable 

それはこのように見ているテーブルを返します。

year 1 2 3 4 5  6 ... 12 //MONTH 
2001 100 100 100 100 100 100   100 

どのように我々のグループの列とするために、フォームに結果を返すことができます例:

year  1-3 4-5 5-10 11-12 //Group the columns! 
    2001  300 200 500 200 

これを行うには、T-SQLクエリが必要です。

答えて

4

サブクエリでは、まず右のあなたヶ月置きますそのテーブルに対してピボットを実行します。

SELECT * 
    FROM (
    SELECT 
    YEAR(OrderDate) [Year], 
    CASE WHEN MONTH(OrderDate)<=3 THEN '1-3' 
      WHEN MONTH(OrderDate)<=5 THEN '4-5', 
      WHEN MONTH(OrderDate)<=10 THEN '6-10', 
      ELSE '11-12' END [MonthRange] 
    SubTotal 
    FROM Sales.SalesOrderHeader 
    ) TableDate 
    PIVOT (
    SUM(SubTotal) 
    FOR [MonthRange] IN (
     ['1-3'],['4-5'],['6-10'],['11-12'] 
    ) 
    ) PivotTable 
+0

+1私はこれがより拡張性があるので、この方が好きです(例えば、私はSUMのためにしか動作しません)。 –

+0

ありがとう!私はこれが私の問題の解決策だと思う:) –

1

私はそれほどPIVOTを使用していません(サンプルを再作成するには十分な情報がありません)が、動的なクエリの実行を確認しました。あなただけの代わりにSELECT *の言う:

SELECT [year], [1-3] = [1] + [2] + [3], [4-5] = [4] + [5], ... 
FROM (SELECT YEAR ...) TableDate 
PIVOT (SUM(SubTotal) FOR ...) PivotTable; 

EDIT @のt-clausen.dkのための簡単な作業例を追加:

CREATE TABLE #x([year] INT, [month] INT, total INT); 

INSERT #x SELECT 2011, 1, 15 
UNION ALL SELECT 2011, 2, 20 
UNION ALL SELECT 2011, 2, 30 
UNION ALL SELECT 2011, 3, 15 
UNION ALL SELECT 2011, 4, 22 
UNION ALL SELECT 2011, 5, 13 
UNION ALL SELECT 2011, 6, 22 
UNION ALL SELECT 2011, 7, 12 
UNION ALL SELECT 2011, 8, 14 
UNION ALL SELECT 2011, 9, 30 
UNION ALL SELECT 2011, 10, 30 
UNION ALL SELECT 2011, 11, 20 
UNION ALL SELECT 2011, 12, 45; 

SELECT 
    [year], 
    [1-3] = [1] + [2] + [3], 
    [4-5] = [4] + [5], 
    [6-10] = [6] + [7] + [8] + [9] + [10], 
    [11-12] = [11] + [12] 
FROM (SELECT [year], [month], total FROM #x) AS TableDate 
PIVOT (
    SUM(total) 
    FOR [month] IN 
    (
     [1], [2], [3], [4], 
     [5], [6], [7], [8], 
     [9],[10],[11],[12] 
    ) 
) AS PivotTable 
ORDER BY [year]; 

DROP TABLE #x; 
+0

この部分はどうすれば[1-3] = [1] + [2] + [3]になりますか? –

+0

列名[1]、[2]などは、PIVOTによって生成された結果セットの一部です。それを試しましたか? –

関連する問題