Autor Beitrag
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Do 15.09.11 15:09 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 178
Erhaltene Danke: 21



BeitragVerfasst: 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
ausblenden 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 !?

Für diesen Beitrag haben gedankt: Oppi35
Oppi35 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 178
Erhaltene Danke: 21



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19
Erhaltene Danke: 1



BeitragVerfasst: So 18.09.11 12:27 
user profile iconOppi35 hat folgendes geschrieben Zum zitierten Posting springen:

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] www.sqlteam.com/foru...c.asp?TOPIC_ID=53293
Oppi35 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: 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