Alles, was ich will, ist diese zu transformieren:anzeigen SQL Ergebnis im Querformat
Period | Department | Print | Copy
---------------------------------------
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
in dieser:
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
Ich habe versucht, das Skript mit PIVOT
zu bauen, aber ich weiß nicht, wie um sowohl "Drucken" als auch "Kopieren" für jede Periode in den Spalten anzuzeigen. Außerdem, da die Werte von 'Periode' unbekannt sind, kann ich den Wert im Skript nicht fest codieren.
Hier ist mein Versuch:
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
Und hier ist das Skript für die Tabelle mit meiner Beispieldaten zu erstellen:
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)
Vielen Dank für jede Antwort im Voraus.
ANTWORT
Ich studierte die eingegangenen Antworten und schließlich die unten stehende Skript bauen:
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);
Trotz einer oberflächlichen Ähnlichkeit mit einem Tabellenkalkulationsprogramm, sind SQL-Tabellen sehr unterschiedliche Tiere - Zeilen und Spalten im Allgemeinen nicht austauschbar sind. Wenn dies nur für * Präsentation * Zwecke ist, wäre es besser, dies in der Präsentations-/Berichtsebene zu tun, nicht in der Datenbank. –
Veröffentlichen Sie Ihre Antwort als solche - eine Antwort und akzeptieren Sie sie, wenn Sie glauben, dass keine der angebotenen Antworten Ihr Problem löst (besser). –