Autor Beitrag
p!nhead
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mo 15.05.06 16:58 
Hallo zusammen! :)

Folgende Problemstellung:

Ich habe eine unsortierte Tabelle in der in 5 verschiedenen Feldern Nachnamen vorkommen könnnen. Nun muss ich diese Tabelle so in ein Dataset einlesen, dass sie von A bis Z sortiert ist, allerdings nicht nur in einem Feld, sondern in allen 5.

Im Anhang ein kleines Beispiel zum besseren Verständniss.

Hat jemand eine Idee dazu die nicht mit viel Arbeit verbunden ist? :)
Einloggen, um Attachments anzusehen!
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mo 15.05.06 17:09 
Normalerweise kann man bei der Abfrage mehere Sortierfelder angeben

ausblenden SQL-Anweisung
1:
select * from tabelle order by feld1, feld2, feld3, feld4, feld5;					

_________________
Markus Kinzler.
p!nhead Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mi 17.05.06 08:10 
Dann sortiert er hauptrangig Feld1 von A-Z. Nur wenn ein eintrag in Feld1 mehrfach vorkommt, wird dann innerhalb dieses Blocks nochmal nach Feld2 sortiert...

Leider nicht die Lösung des Problems.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 17.05.06 08:19 
Und wonach soll sortiert werden, wenn in mehreren Feldern eines Datensatzes Namen drin stehen?
Auf einer Oracle-DB wüsste ich, wie man da ran gehen könnte. Ob allerdings deine DB den Befehl "Decode" kennt, weiß ich nicht. Zur Vereinfachung würde ich dir auf jeden Fall ein View empfehlen, falls das mit deiner DB machbar ist.
p!nhead Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mi 17.05.06 10:42 
MS SQL ^^

Schau dir mal das Beispiel an, dann dürfte relativ klar werden wie sortiert werden muss (hoffe ich) :)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 17.05.06 10:53 
Da müssen dann viellicht mal die MS-SQL-Spezis was zu sagen.
Dein Beispiel habe ich mir angesehen. Ist es wirklich so, dass innerhalb eines Datensatzes immer der selbe Name eingetragen sein kann?
p!nhead Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mi 17.05.06 10:56 
Ja, kann, muss aber nicht :)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 17.05.06 11:04 
Dann müsstest du für jedes asugefüllte Namensfeld den Datensatz mehrfach drin haben, da sonst nicht klar ist, wonach sortiert werden soll.
Im Moment sehe ich nur eine Lösung über "Union".
p!nhead Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mi 17.05.06 11:30 
Genau so siehts aus! :)

was genau ist "Union"? Kenne ich nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 17.05.06 12:03 
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
select feld1 from tabelle
where feld1 <> ''
union
select feld2 from tabelle
where feld2 <> ''
union
select feld3 from tabelle
where feld3 <> ''
union
select feld4 from tabelle
where feld4 <> ''
union
select feld5 from tabelle
where feld5 <> ''
order by feld1

ungeprüft!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 17.05.06 12:53 
1. Was steht in den Feldern drin, wenn nichts drin steht? NULL oder ''?
2. Wonach soll sortiert werden, wenn in mehreren Feldern ein Name steht?

Wenn 1=NULL und 2="1.Feld", dann klappt das hier:

ausblenden Delphi-Quelltext
1:
2:
select * from tabelle 
order by coalesce (feld1,feld2,feld3,feld4,feld5)


'coalesce (x,y,z)' liefert den ersten Wert (von links aus gesehen) der Liste, der nicht NULL ist.

_________________
Na denn, dann. Bis dann, denn.
p!nhead Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mi 17.05.06 13:23 
Ja, "Null". Aber das Problem ist, das in den 5 Feldern auch 2 oder mehrere verschiedene Namen vorkommen können.

Bsp.:
Wenn mittendrin in der Tabelle ein Datensatz kommt in dem das Feld Name1 den Wert "Marius" aber das Feld Name4 den Wert "Arnold" hat, so muss der Datensatz 2 mal erscheinen... einmal ziemlich am Anfang bei A (wegen "Arnold" in Name4) und einmal bei M (wegen "Marius" in Name1).
p!nhead Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mi 17.05.06 13:48 
user profile iconjasocul hat folgendes geschrieben:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
select feld1 from tabelle
where feld1 <> ''
union
select feld2 from tabelle
where feld2 <> ''
union
select feld3 from tabelle
where feld3 <> ''
union
select feld4 from tabelle
where feld4 <> ''
union
select feld5 from tabelle
where feld5 <> ''
order by feld1

ungeprüft!


Mhh.. erstmal kommt die Meldung im Enterprise-Manager "Der Designer stellt das SQL UNION Construct nicht bereit.".

Dann scheint er es aber doch zu machen...

Aber leider weiss ich nicht wie ich das auf meine Tabelle(n) anwenden soll, da die Felder 1-5 eigtl nur ID's sind die auf eine weitere Tabelle verweisen, welche dann unter den ID's die dazugehoerigen Namen stehen hat... Momentan spucke ich die Namen dann mit "Left outer Join" aus, aber wie ich das auf dein Beispiel anwenden kann, weiss ich leider nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 17.05.06 14:18 
Das join kannst du trotzdem machen. Allerdings jetzt bei jedem einzelnen Statement des Union-Konstrukts.
p!nhead Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Mi 17.05.06 14:31 
ich habe es mal versucht so auf meine Tabellen anzuwenden:

exklusives Beispiel:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
SELECT     dbo.tblAdresse.vCh100_NameFirma AS Name, dbo.tblVertragsabschluss.int10_VertragsabschlussID
FROM         dbo.tblVertragsabschluss LEFT OUTER JOIN
                      dbo.tblAdresse ON dbo.tblVertragsabschluss.int10_BezAdressenID_AB = dbo.tblAdresse.int10_AdressenID
WHERE     (dbo.tblVertragsabschluss.vCh8_AbschlussDatum > N'20060301')
UNION
SELECT     dbo.tblAdresse.vCh100_NameFirma AS Name, dbo.tblVertragsabschluss.int10_VertragsabschlussID
FROM         dbo.tblVertragsabschluss LEFT OUTER JOIN
                      dbo.tblAdresse ON dbo.tblVertragsabschluss.int10_BezAdressenID_S1 = dbo.tblAdresse.int10_AdressenID
WHERE     (dbo.tblVertragsabschluss.vCh8_AbschlussDatum > N'20060301')
UNION
SELECT     dbo.tblAdresse.vCh100_NameFirma AS Name, dbo.tblVertragsabschluss.int10_VertragsabschlussID
FROM         dbo.tblVertragsabschluss LEFT OUTER JOIN
                      dbo.tblAdresse ON dbo.tblVertragsabschluss.int10_BezAdressenID_S2 = dbo.tblAdresse.int10_AdressenID
WHERE     (dbo.tblVertragsabschluss.vCh8_AbschlussDatum > N'20060301')
ORDER BY Name


allerdings spuckt er mir so nur ein Feld mit dem Namen aus, nicht alle 3.

allerdings scheint die Sortierung so geklappt zu haben.... nun habe ich die VertragsabschlussID's und kann die einfach anhand eines zweiten Datasets Stück für Stück abarbeiten... Geht zwar bestimmt noch einfacher, aber wenigstens habe ich jetzt schonmal einen Lösungsweg.

Vielen Dank schonmal soweit, aber falls jemand weiss wie ich dies mit einer einzigen SQL Anweisung (einem einzigen Dataset) hinbekomme, wäre das natürlich noch besser :)