Warum nicht pivot
verwenden? es ist einfacher als andere Lösungen wie case
Ausdruck:
SELECT *
FROM table
PIVOT
(
SUM(SalesQty)
FOR Month IN([Apr-17] ,[May-17], [Jun-17], [Jul-17])
) AS p;
es zu tun dynamisch können Sie die gleiche Abfrage mit dynamischem SQL wie folgt verwenden:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' +QUOTENAME(CONCAT(LEFT(datename(month, Month), 3),
CAST(DATEPART(day, month) AS NVARCHAR(2))))
FROM table1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @query = ' SELECT *
FROM
(
SELECT product, SalesQty,
CONCAT(LEFT(datename(month, Month), 3),
CAST(DATEPART(day, month) AS NVARCHAR(2))) AS Month
FROM table1
) AS t
PIVOT
(
SUM(SalesQty)
FOR Month IN(' + @cols + ')
) AS p';
execute(@query);
dynamic demo
Wenn Sie möchte nicht PIVOT
verwenden dann können Sie CASE
Ausdruck wie folgt verwenden:
SELECT product,
SUM(CASE WHEN month = 'Jan17' THEN SalesQty ELSE 0 END) AS Jan17,
SUM(CASE WHEN month = 'Jan17' THEN SalesQty ELSE 0 END) AS Jun17,
SUM(CASE WHEN month = 'Jan17' THEN SalesQty ELSE 0 END) AS Jul17
FROM
(
SELECT product, SalesQty,
CONCAT(LEFT(datename(month, Month), 3),
CAST(DATEPART(day, month) AS NVARCHAR(2))) AS Month
FROM table1
) AS t
GROUP BY Product;
Um dies dynamisch auszuführen, müssen Sie nur den Ausdruck für die Groß-/Kleinschreibung in der Variablen cols names durch dynamic ersetzen.
Bitte erläutern Sie, was Sie versucht haben und warum es fehlgeschlagen ist. Es wird uns erlauben zu beurteilen, wie viel Sie wissen und wie viel Sie erklären müssen. – RandomSeed
Warum können Sie Pivot nicht verwenden? Gibt es eine obere Grenze für die Anzahl der zu erstellenden Spalten? ist Dynamisches SQL erlaubt? Warum werden Datentransformationen auf der Datenbankebene ausgeführt, wenn es sich um ein Präsentationsproblem handelt? – xQbert