T-SQL Abfrage, Erstellen einer Sicht mit Parametern, die aus einer Schleife (array) stammen
Hallo,
ich ochse gerade an einem Problem rum.
Ich habe in Excel eine Listbox. Aus dieser sollen Lagerplätze gewählt werden. Die entsprechende Lagerplatznummer wird in ein Array strLagerplatz() geschrieben:
strLagerplatz(0) = "70284"
strLagerplatz(1) = "70999"
...
Nun möchte ich einen View bauen, der flexibel auf die Anzahl der Lagerplätze reagiert.
Hat da jemand eine Idee?
ich ochse gerade an einem Problem rum.
Ich habe in Excel eine Listbox. Aus dieser sollen Lagerplätze gewählt werden. Die entsprechende Lagerplatznummer wird in ein Array strLagerplatz() geschrieben:
strLagerplatz(0) = "70284"
strLagerplatz(1) = "70999"
...
Nun möchte ich einen View bauen, der flexibel auf die Anzahl der Lagerplätze reagiert.
Create View vwIrgendwas AS
Select
SUM(DISTINCT case **when Lagerplatzkennung = strLagerplatz(y)** then Bestand else 0 end) AS strLagerplatz(y)
...
Hat da jemand eine Idee?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 310987
Url: https://administrator.de/contentid/310987
Ausgedruckt am: 08.11.2024 um 21:11 Uhr
3 Kommentare
Neuester Kommentar
Moin Aximand,
Was du eigentlich willst, ist eine Pivotierung mit einer dynamischen Anzahl Spalten.
Ist bis dahin nicht exotisch oder verwegen - aber du willst es auf einem SQL-Server.
Das geht sich leider nicht.
Der T-SQL-Sprachumfang kennt zwar eine PIVOT-Syntax der Form:
Problem ist, das vor allem die <keyliste> , aber auch die <Feldliste> NICHT dynamisch angegeben werden kann.
Auch nicht als
Bedeutet:
ähnlich wie SlaintheMhath durch die Blume hat durchblicken lassen, musst du in mehrere Teilschritten
- erst einen Teilstring zusammenbasteln, der meinen Platzhalter
- einen weiteren Teilstring, der den Platzhalter
- einen großes Gesamtstatement zusammenbasteln, das meiner obigen Skizze entspricht
- mit diesem dynamisch erzeugten Statement den DB-Server belästigen und auf ein Resultset warten
- und dieses Resultset auch irgendwie dynamisch verwerten - da sind Spaltennamen drin, die ja nur der Statement-generierer kenn kann.
Ein in diesem Kontext vollkommen irrelevanter Schritt wäre, statt dieses dynamisch erzeugten (Einmal-)Statements nun auch noch einen View zu erzeugen bzw anzulegen... wozu?
Der View enthält doch nur die x Lagerplätze, die sich ein Benutzer gerade spontan ausgewählt hat. Das wird 1x gebraucht.
Einen View brauchst doch nur, wenn diese Abfrage mehrmals verwendet wird.
Egal, jedenfalls würde man dieses Statement eigentlich in einer stored procedure auf der (DB-)Serverseite generieren lassen.
In der Theorie kannst du es natürlich auch mit Excel-VBA zusammenklöppeln auf der Clientseite.
Ist zwar eine etwas wilde Aufgabenverteilung, aber solange du nicht noch zusätzlich mal eben irgendwelche Views auf dem Server droppen+neiu anlegen musst, wird dich dein DBA nicht erschiessen.
Befrag mal eine Suchmaschine nach "TSQL pivot dynamisch" (oder ähnlich), da gibt es Tonnen von Beispielen.
Ein deutschsprachiges empfehle ich für das grundsätzliche Verständnis: http://www.itrain.de/knowhow/sql/tsql/pivot/index.asp
Handwerklich brauchbare Lösungen finden sich anscheinened eher auf outlandish.
Vielleicht dieses hier:
http://blog.programmingsolution.net/sql-server-2008/sql-server-pivot-co ...
Grüße
Biber
Zitat von @Aximand:
Nun möchte ich einen View bauen, der flexibel auf die Anzahl der Lagerplätze reagiert.
ist alles vom Ansatz her schon zum Scheitern verurteilt... da liegen ein paar Missverständnisse vor.Nun möchte ich einen View bauen, der flexibel auf die Anzahl der Lagerplätze reagiert.
Was du eigentlich willst, ist eine Pivotierung mit einer dynamischen Anzahl Spalten.
Ist bis dahin nicht exotisch oder verwegen - aber du willst es auf einem SQL-Server.
Das geht sich leider nicht.
Der T-SQL-Sprachumfang kennt zwar eine PIVOT-Syntax der Form:
SELECT <Feldliste > -- zB Lager70284, Lager70999, ...
From Tabelle
PIVOT
max(bestand)
FOR LagerPlatzkennung IN ( <keyliste>)
Problem ist, das vor allem die <keyliste> , aber auch die <Feldliste> NICHT dynamisch angegeben werden kann.
Auch nicht als
..For Lagerplatzkennung IN (SELECT Lagerplatzkennung from AlleLagerplätze)
.Bedeutet:
ähnlich wie SlaintheMhath durch die Blume hat durchblicken lassen, musst du in mehrere Teilschritten
- erst einen Teilstring zusammenbasteln, der meinen Platzhalter
<Feldliste>
zusammenbastelt,- einen weiteren Teilstring, der den Platzhalter
<keyliste>
zusammenbastelt- einen großes Gesamtstatement zusammenbasteln, das meiner obigen Skizze entspricht
- mit diesem dynamisch erzeugten Statement den DB-Server belästigen und auf ein Resultset warten
- und dieses Resultset auch irgendwie dynamisch verwerten - da sind Spaltennamen drin, die ja nur der Statement-generierer kenn kann.
Ein in diesem Kontext vollkommen irrelevanter Schritt wäre, statt dieses dynamisch erzeugten (Einmal-)Statements nun auch noch einen View zu erzeugen bzw anzulegen... wozu?
Der View enthält doch nur die x Lagerplätze, die sich ein Benutzer gerade spontan ausgewählt hat. Das wird 1x gebraucht.
Einen View brauchst doch nur, wenn diese Abfrage mehrmals verwendet wird.
Egal, jedenfalls würde man dieses Statement eigentlich in einer stored procedure auf der (DB-)Serverseite generieren lassen.
In der Theorie kannst du es natürlich auch mit Excel-VBA zusammenklöppeln auf der Clientseite.
Ist zwar eine etwas wilde Aufgabenverteilung, aber solange du nicht noch zusätzlich mal eben irgendwelche Views auf dem Server droppen+neiu anlegen musst, wird dich dein DBA nicht erschiessen.
Befrag mal eine Suchmaschine nach "TSQL pivot dynamisch" (oder ähnlich), da gibt es Tonnen von Beispielen.
Ein deutschsprachiges empfehle ich für das grundsätzliche Verständnis: http://www.itrain.de/knowhow/sql/tsql/pivot/index.asp
Handwerklich brauchbare Lösungen finden sich anscheinened eher auf outlandish.
Vielleicht dieses hier:
http://blog.programmingsolution.net/sql-server-2008/sql-server-pivot-co ...
Grüße
Biber