私が欲しいのは、これを変換することですを表示するSQL結果は
Department | 201601 Print | 201601 Copy | 201602 Print | 201602 Copy | 201603 Print | 201603 Copy
------------------------------------------------------------------------------------------
Dept 1 | 10 | 20 | 30 | 40 | 50 | 60
Dept 2 | 20 | 10 | 40 | 30 | 60 | 50
私はPIVOT
でスクリプトを構築しようとしていたが、私は方法がわかりません列内の各期間の「印刷」と「コピー」の両方を表示します。 さらに、 'Period'の値は不明なので、スクリプトの値もハードコーディングできません。ここで
は私の試みです:
SELECT [Department]
,[201601] AS [201601 Copy]
,[201602] AS [201602 Copy]
,[201603] AS [201603 Copy]
FROM
(SELECT [Copy], [Period], [Department] from #tempTable) AS ST
PIVOT
(SUM([Copy]) FOR [Period] IN ([201601],[201602],[201603])) AS PT
そして、ここでは私のサンプルデータを持つテーブルを作成するためのスクリプトです:事前に任意の応答を
IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL
DROP TABLE #tempTable
CREATE TABLE #tempTable(
[Period] varchar(50)
,[Department] varchar(50)
,[Print] int
,[Copy] int
)
INSERT INTO #tempTable VALUES
('201601', 'Dept 1', 10, 20)
,('201601', 'Dept 2', 20, 10)
,('201602', 'Dept 1', 30, 40)
,('201602', 'Dept 2', 40, 30)
,('201603', 'Dept 1', 50, 60)
,('201603', 'Dept 2', 60, 50)
感謝。
ANSWER
私が受け取った答えを学び、最終的に以下のスクリプトを構築する:あなたは、動的SQLクエリを使用することができます
DECLARE @sql AS varchar(max);
SELECT @sql = 'SELECT [Department],' +
STUFF((
SELECT DISTINCT
',SUM(ISNULL(CASE [Period] WHEN ''' + [Period] + ''' THEN [Print] END, 0)) AS [' + [period] + ' Print]' +
',SUM(ISNULL(CASE [Period] WHEN ''' + [Period] + ''' THEN [Copy] END, 0)) AS [' + [period] + ' Copy]'
FROM #TempTable
FOR XML PATH('')
), 1, 1, '') +
'FROM #TempTable
GROUP BY [Department]';
PRINT @sql
EXEC(@sql);
、SQLテーブルは非常に異なる獣です - 行と列は、一般的に交換可能ではありません。これが純粋に*プレゼンテーション*の目的のためのものであれば、データベースではなくプレゼンテーション/レポート層でこれを行う方がよいでしょう。 –
あなたの答えをそのように投稿してください - あなたの答えがあなたの問題を解決するものがないと思うなら、それを受け入れてください。 –