2017-03-07 17 views
8

私が欲しいのは、これを変換することですを表示する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); 
+1

、SQLテーブルは非常に異なる獣です - 行と列は、一般的に交換可能ではありません。これが純粋に*プレゼンテーション*の目的のためのものであれば、データベースではなくプレゼンテーション/レポート層でこれを行う方がよいでしょう。 –

+0

あなたの答えをそのように投稿してください - あなたの答えがあなたの問題を解決するものがないと思うなら、それを受け入れてください。 –

答えて

5

を。

クエリ

declare @sql as varchar(max); 
select @sql = 'select [Department],' + stuff((
    select distinct ',max(case [Period] when ' + char(39) + [Period] + char(39) + 
    ' then [Print] end) [' + [period] + ' Print]' 
    + ',max(case [Period] when ' + char(39) + [Period] + char(39) + 
    ' then [Copy] end) [' + [period] + ' Copy]' 
    from #TempTable 
    for xml path('') 
), 1, 1, ''); 

select @sql += ' from #TempTable group by [Department];'; 
exec(@sql); 
+0

魅力のように動作します、多くのありがとうございます。私はちょっと編集して、私の質問に私の最終的なスクリプトを示しました。 – pblyt

0

あなたは、ISNULL()とSUM()関数を使用してこれを達成することができます。

SELECT [Department] 
     ,SUM(ISNULL(CASE WHEN [Period]='201601' THEN [Print] END,0)) AS [201601 Print] 
     ,SUM(ISNULL(CASE WHEN [Period]='201601' THEN Copy END,0)) AS [201601 Copy] 
     ,SUM(ISNULL(CASE WHEN [Period]='201602' THEN [Print] END,0)) AS [201602 Print] 
     ,SUM(ISNULL(CASE WHEN [Period]='201602' THEN Copy END,0)) AS [201602 Copy] 
     ,SUM(ISNULL(CASE WHEN [Period]='201603' THEN [Print] END,0)) AS [201603 Print] 
     ,SUM(ISNULL(CASE WHEN [Period]='201603' THEN Copy END,0)) AS [201603 Copy]    
FROM #tempTable 
GROUP BY [Department] 
+0

きれいで簡単なクエリをお寄せいただきありがとうございますが、期間の値は不明で、動的SQLを使用する必要があります。 – pblyt

+0

その場合、@Ullasコードを使用することができます! – balaji

0
SELECT Department,SUM([201601Print])[201601 Print],SUM([201601Copy])[201601 Copy],SUM([201602Print])[201602 Print], 
       SUM([201602Copy])[201602 Copy],SUM([201603Print])[201603 Print],SUM([201603Copy])[201603 Copy] FROM (
SELECT [Department] 
,[201601] AS [201601Copy] 
,[201602] AS [201602Copy] 
,[201603] AS [201603Copy] 
,0 AS [201601Print] 
,0 AS [201602Print] 
,0 AS [201603Print] 
FROM 
(SELECT [Period],[Copy], [Department] from #tempTable) AS ST 
PIVOT 
(SUM([Copy]) FOR [Period] IN ([201601],[201602],[201603])) AS PT 
UNION ALL 
SELECT [Department] 
,0 AS [201601Copy] 
,0 AS [201602Copy] 
,0 AS [201603Copy] 
,[201601] AS [201601Print] 
,[201602] AS [201602Print] 
,[201603] AS [201603Print] 
FROM 
(SELECT [Period],[Print], [Department] from #tempTable) AS ST 
PIVOT 
(SUM([Print]) FOR [Period] IN ([201601],[201602],[201603])) AS PT 
)A GROUP BY Department 
5

ピボットを使用する別の動的SQL。
しかし、これは変数@Columnsを使用して列名の文字列を生成します。スプレッドシートに表面的な類似性にもかかわらず

declare @Columns varchar(max); 
set @Columns = STUFF((SELECT ', ' + QUOTENAME([Period] +' Print') + ', ' + QUOTENAME([Period] +' Copy') FROM #tempTable GROUP BY [Period] FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)') ,1,1,''); 

declare @SQL varchar(max); 
set @SQL = 'select * 
from (
select [Department], [Period] + '' Print'' as Title, [Print] as Value from #tempTable 
union all 
select [Department], [Period] + '' Copy'' as Title, [Copy] as Value from #tempTable 
) q 
pivot (sum(Value) for Title in ('+ @Columns +')) p;'; 

--select @SQL; 
exec (@SQL); 
+0

あなたのすてきな答えのための@LukStormsに感謝します。しかし、残念ながら私はUllasの回答を1つの変数しか使用しませんでした。私は答えとして両方を選ぶことができれば幸いです! – pblyt

関連する問題