8

sales(int)列のあるテーブルがありますmonth(int)。毎月対応する売上高を取得したい。各列(月)の売上を含む単一のレコードが存在する、各月に対応する12列の形式の出力が必要です。

4

5 に答える 5

10

行と列を切り替えるためのPIVOTを確認する必要があります。これにより、毎月のselectステートメントが防止されます。このようなもの:

DECLARE @salesTable TABLE
(
    [month] INT,
    sales INT
)

-- Note that I use SQL Server 2008 INSERT syntax here for inserting
-- multiple rows in one statement!
INSERT INTO @salesTable
VALUES (0, 2) ,(0, 2) ,(1, 2) ,(1, 2) ,(2, 2)
      ,(3, 2) ,(3, 2) ,(4, 2) ,(4, 2) ,(5, 2)
      ,(6, 2) ,(6, 2) ,(7, 2) ,(8, 2) ,(8, 2)
      ,(9, 2) ,(10, 2) ,(10, 2) ,(11, 2) ,(11, 2)

SELECT [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]
FROM
(
    SELECT [month], sales
    FROM @salesTable
) AS SourceTable
PIVOT
(
    SUM(sales)
    FOR [month] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])
) AS PivotTable
于 2009-04-29T11:28:43.377 に答える
2

きれいではありません...しかし、これはうまくいきます

SELECT
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 1) [Sales1],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 2) [Sales2],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 3) [Sales3],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 4) [Sales4],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 5) [Sales5],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 6) [Sales6],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 7) [Sales7],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 8) [Sales8],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 9) [Sales9],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 10) [Sales10],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 11) [Sales11],
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 12) [Sales12]
于 2009-04-29T11:26:41.430 に答える
2

これは、(特に列名を)もう少し制御できるピボットを作成する別の方法です。の動的SQLを生成するのも少し簡単です。

ロビンの答えに似ていますが、テーブルを1回だけヒットするという利点があります。

select
  Sales1 = sum( case when Month = 1 then Sales end )
, Sales2 = sum( case when Month = 2 then Sales end )
, Sales3 = sum( case when Month = 3 then Sales end )
-- etc..
from SalesTable;

調査を行ったところ、新しいピボット演算子はこのタイプのクエリの単なる構文糖衣のようです。クエリプランは同じように見えます。

興味深いことに、unpivot演算子も単なるシンタックスシュガーのようです。例えば:

次のようなテーブルがある場合:

Create Table Sales ( JanSales int, FebSales int, MarchSales int...)

あなたは書ける:

 select unpivoted.monthName, unpivoted.sales
 from Sales s
 outer apply (
    select 'Jan', JanSales union all
    select 'Feb', FebSales union all
    select 'March', MarchSales
 ) unpivoted( monthName, sales );

そして、ピボットされていないデータを取得します...

于 2009-05-01T00:17:32.690 に答える
1

OLAPを使用してそれを行うことができます。このトピックに関するMSDNドキュメントへの別のリンクがあります。

OLAPを使用すると、必要なレイアウトを使用して、必要な情報を使用してキューブを作成できます。

そのようにしたくない場合は、.NET、Java、TransacSQL、またはSQLServerデータを操作するための優先言語を使用してサマリーテーブルを作成する必要があります。

于 2009-04-29T11:29:18.867 に答える
0

列をその名前の行に簡単に転置するには、XMLを使用する必要があります。私のブログでは、これを例で説明しました:リンク

于 2011-04-08T13:34:43.150 に答える