Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - SQL-Server: Daten transponieren
Oppi35 - Do 15.09.11 15:09
Titel: SQL-Server: Daten transponieren
Hallo Zusammen,
da ich in keinem SQL-Server Forum registriert bin, versuche ich meine Frage vorab hier beantwortet zu bekommen:)
Folg. Daten habe ich im SQL-Server vorliegen:
Kunde Artikel
1 A
2 B
2 C
3 D
Und so soll meine neue View aussehen:
Kunden Artikel1 Artikel2
1 A
2 B C
3 D
Ich habe es bereits über die Pivot-Funktion versucht; dies hat allerdings nicht geklappt. Es muss hier auch nichts aggregiert werden.
Kennt jemand hier einen Weg, wie ich das gewünschte Ergebnis erziele?
Ergänzende Info:
Idealerweise funktioniert die Abfrage für n-Artikel. Allerdings benötige ich für meinen aktuellen Fall lediglich eine Abfrage für max. 4 Artikel.
Gruß
Frank
dark-destination1988 - Do 15.09.11 15:34
mhh grundsätzlich würde ich sagen das das so der falsche tabellen aufbau ist
meiner meinung brauchst du mehrere tabellen:
tabelle 1 Kunde
id,name, vorname,...(weitere Infos)
tabelle 2 Artikel
id,ArtikelName, Preis...(weitere Infos)
tabelle 3 Bestellungen
kunden_id, artikel_id
und das du dann 2 artikel aus unterschiedlichen Datarows in einer zeile darstellst ist denke ich nicht möglich (mit group by kannst du zwar nach der kunden id gruppieren, aber wie willst du dann die artikelnamen darstellen (bei group by dürfen NUR AGGREGATFUNKTIONEN UND GROUP BY Spalten in die Selectklausel)
Wozu brauchst du den so einen View?
wenn du anhand vonfolgenden statement und den oben genannten tabellen
SQL-Anweisung
1: 2: 3:
| select kd.name,kd.vorname,art.artikelname from kunde kd, artikel art, bestellung best where kd.id=best.Kunden_id and kd.id=best.artikel.id |
die bestellungen aller kunden darstellst ist das doch geeigneter !?
Oppi35 - Fr 16.09.11 09:38
Den Tabellenaufbau kann ich leider nicht beeinflussen. Die Tabelle bekomme ich leider nur so geliefert.
Zu Deiner Frage, warum ich so eine View benötige:
Am Ende muss ich für jeden Kunden einen Serienbrief erzeugen. Hier müssen u.a. die Informationen "Kunde, Artikel1, Artikel2, Artikel3 und Artikel4" in dem Serienbrief erscheinen. Daher benötige ich für jeden Kunden eine Zeile mit den nötigen Infos.
Bisher wurde es mit Excel und VBA Code bearbeitet. Die Daten wurden entsprechend sortiert und mit Hilfe einer Schleife in eine neue Tabelle eingefügt.
Man könnte jetzt natürlich sagen: "Dann mach es doch genauso wie bisher, wenns gut war".
Dieser Schritt ist nur ein kleiner Teil eines größeren Projektes. Es wäre jetzt ungünstig, wenn dies nicht im SQL-Server laufen könnte, zudem dann einige Automatismen, die ich bisher eingerichtet habe nicht sauber funktionieren würden.
dark-destination1988 - Fr 16.09.11 10:48
und einzeln das ganz abarbeiten geht nicht?
also wenn du dein select formulierst
select artikel
from deinetabelle
where kunde = 2
Ergebnis:
B
C--> und dann aufbereiten?
stendate - So 18.09.11 12:27
Oppi35 hat folgendes geschrieben : |
Dieser Schritt ist nur ein kleiner Teil eines größeren Projektes. Es wäre jetzt ungünstig, wenn dies nicht im SQL-Server laufen könnte, zudem dann einige Automatismen, die ich bisher eingerichtet habe nicht sauber funktionieren würden. |
Es gibt mehrere Ansätze [1], ich finde die meisten jedoch relativ krank... Wenn es jetzt nicht umbedingt gleich 10^6 Datensätze auf einmal sind, würde ich das sogar auf dem Client der DataReader zusammensetzen lassen. Das kommt natürlich auf das zu erwartende Lastmuster an.
[1]
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=53293
Oppi35 - So 18.09.11 21:56
Vielen Dank an Alle!!!
Ich habe mich am Wochenende auch selber hingesetzt und probiert; mit Erfolg.
Selbst wenn es 10^6 Datensätze wären, die betroffen sind, würde der Code funktionieren (aber ich glaube es gibt eine maximale Spaltenanzahl die event. gesprengt werden würde).
Mit der "Fetch" Anweisung kann man Datensätze Zeile für Zeile durchlaufen und in entsprechenden lokalen Variablen zwischenspeichern. Die Fetch-Anweisung kann man verwenden, wenn man vorher einen sog. "Scroll-Cursor" deklariert hat.
So lässt sich prüfen, ob der vorherige Datensatz den gleichen Kunden enthält, wie der aktuelle Datensatz. Wenn dem so ist, wird ein Counter hochgezählt, der letztendlich speichert, wieviele Verträge ein Kunde maximal enthält. So können dann die notwendigen Spalten generiert werden.
Die Inhalte der Spalten werden dann in einer entsprechenden while-Schleife eingefügt. (While @@FETCH_STATUS=0). Erläuterungen hierzu s. MSDN-Library.
Auf Wunsch stelle ich gerne meinen erstellten Code zur Verfügung.
Viele Grüße
Frank
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!