2017-09-20 3 views
-1

Ich habe einige Werte in Zeilen wie:Wie Spalten in Zeilen in SQL Server ohne Schwing- und Wert konvertieren ist dynamisch

Month | Product | SalesQty 
-------+---------+--------- 
Jan-17 | ABC  | 3 
Feb-17 | ABC  | 6 
Apr-17 | ABC  | 19 

Aber ich mag wie die einige Werte in Spalten zeigen:

Model| Apr-17 | May-17 | Jun-17 | Jul-17 
ABC  1   2  12  0 
BCS  212  12  12  112 

Monate müssen dynamisch generiert werden. Der statische Monat wird mir in dieser Situation nicht helfen.

+1

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

+0

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

Antwort

2

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.

+0

@xQbert - Ja, ich habe es gerade bemerkt, aber vielleicht weiß er nicht, dass er es dynamisch machen kann. Ich kann keinen Grund sehen, warum er das ohne Pivot machen möchte. Ich werde jetzt eine alternative Lösung hinzufügen. –

Verwandte Themen