Spaltenbezeichnung dynamisch (CASE WHEN)

spufi77

Neuer Benutzer
Beiträge
3
Hallo,
ich habe eine Tabellenwertfunktion der ein Datum übergeben wird und Summen (über pivot) der nächsten 12 Monate ausgibt. Nun möchte ich die Spalten Jan, Feb usw. benennen. Wenn 01.04.2024 übergeben wird, angefangen mit Apr, Mai, ..., Feb, Mär

SELECT *,
CASE MONTH(@dvon)
WHEN 1 THEN [1]
WHEN 2 THEN [2]
WHEN 3 THEN [3]
WHEN 4 THEN [4]
WHEN 5 THEN [5]
WHEN 6 THEN [6]
WHEN 7 THEN [7]
WHEN 8 THEN [8]
WHEN 9 THEN [9]
WHEN 10 THEN [10]
WHEN 11 THEN [11]
WHEN 12 THEN [12]
END AS Monat1,
CASE MONTH(@dvon)
WHEN 1 THEN [2]
WHEN 2 THEN [3]
WHEN 3 THEN [4]
WHEN 4 THEN [5]
WHEN 5 THEN [6]
WHEN 6 THEN [7]
WHEN 7 THEN [8]
WHEN 8 THEN [9]
WHEN 9 THEN [10]
WHEN 10 THEN [11]
WHEN 11 THEN [12]
WHEN 12 THEN [1]
END AS Monat2,
usw.

Leider kann man den Alias nicht mit in die CASE WHEN schreiben.
CASE MONTH(@dvon)
WHEN 1 THEN [1] AS Jan

Hat jemand eine Idee oder sogar eine elegantere Lösung für mein Problem? Kann man Spaltenbezeichnungen dynamisch vergeben?
 
Werbung:
Also wenn du innerhalb eines Selects mehr als eine Spalte von dem CASE abhängig machen willst dann musst du leider das CASE mehr als einmal identisch ausführen. Alternativ kannst du mit einem inneren und einem äußeren Select arbeiten, das dürfte bei PIVOT aber weniger angenehm sein.

Vielleicht hilft dir schon datename(month,<datum>) dabei, deinen Code schlanker zu machen aber vielleicht verstehe ich dein Vorhaben auch noch nicht richtig :-)
 
Du kannst in Standard SQL keine variierenden Spaltennamen haben.
Das ist auch leicht verständlich, weil keine anderen SQL Statements einer statischen Anwendung und auch Schwesterobjekte in der DB darüber keine Kenntnis haben können.
Es gibt dafür relativ aufwendige Pakete in verschiedenen Systemen, vielleicht auch bei MSSQL, weiß ich aber nicht.

Der naheliegende Weg ist der Zusammenbau des Statements in einem Client oder vergleichbar in einer SP der DB selbst, die das Statement auf Stringebene erstellt und dynamisch ausführt und als Table zurück gibt.
 
Dann formuliere ich um. Die Rückgabetabellen sollen so aussehen:

Übergabedatum: 01.06.2023
IDBezeichnungJunJulAugSepOktNovDezJanFebMärAprMai
1XYZ458532116874652385556435
2ABC22


Übergabedatum: 01.09.2023
IDBezeichnungSepOktNovDezJanFebMärAprMaiJunJulAug
1XYZ116874652385556435547736
2ABC44

die Spaltennamen sollen also nicht "Monat 1,2,3" sondern "Jan,Feb,Mär" sein, beginnend sortiert je nach Übergabedatum.
 
Zuletzt bearbeitet:
Sorry, ich muss etwas zurücknehmen. Was ich im Sinn hatte, war ein View bzw. Table Functions, die einen Table Typ / Cursor verwenden.
Ich weiß nicht, was unter MSSQL da für Optionen bestehen.

Mit einem Select auf die Table Function im Client, kannst Du die Feldreihenfolge auf jeden Fall selbst bestimmen.
Ein Beispiel für die Monatsbenennung von Spalten in Pivot Abfragen findest Du hier:
 
Ja, ich kann die Reihenfolge selber definieren
SELECT [4] as Apr, [5] as Mai ....
aber dann fängt das ja immer mit April an. Ich möchte das beginnend mit dem Monat des Übergabedatums haben. Deswegen ja die Idee mit dem CASE (Wenn Monat = x dann Spaltenbezeichnung x, y, z, a, ...). Aber ich bekomme den Spaltenalias nicht in ein CASE Statement. Un deine Alternatividee fehlt mir...
 
So gesehen ist deine Spaltenauswahl schon dynamisch, ist eigentlich das gleiche Problem wie mit komplett dynamischen Namen außer das es maximal 12 Varianten gibt. Steht dir nur ein einzelner Select zur Verfügung (also z.B. als Basis einer View) oder kannst du mehrere Statements in ein Script legen?

Normalerweise wäre dynamisches SQL das Mittel der Wahl für dynamisches Pivot. Alternativ könnte man mit IF auch 12 Varianten in ein Script hängen. Ansonsten muss man eine Funktion bauen, die die Tabelle zurück liefert, das könnte sogar in einer View gehen. Das habe ich aber noch nicht ausprobiert, in der Form.
 
Werbung:
aber dann fängt das ja immer mit April an.
Na das meine ich ja mit der Function und der Table Rückgabe. Wie ist das umgesetzt im Funktionsrumpf, mit Cursor, ..? Ich kann da bei MSSQL nicht viel zusagen. Aber grundsätzlich ist es doch so, die Function spuckt natürlich eine feste Reihenfolge aus, aber darauf kannst Du ja im Client ein Select machen oder? Das müsste man nach Bedarf zusammenbauen.
 
Zurück
Oben