![]() |
Datenbank: MS SQL • Zugriff über: ADO
Eine etwas komplexere Sortierung
Liste der Anhänge anzeigen (Anzahl: 1)
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? :) |
Re: Eine etwas komplexere Sortierung
Ein einfaches ORBER BY in der Abfrage tut es nicht ? :gruebel:
Du kannst dich mehrere Felder in der Sortierung eingeben.
SQL-Code:
- 1. Sortierung auf Name1
SELECT * FROM <TABELLENNAME>
ORDER BY Name1,Name3,Name5 - wenn Name1 gleich dann 2. Sortierung auf Name3 - wenn Name 1 und 2 gleich dann 3. Sortierung auf Name5 PS: Dein Screenshot sieht irgendwie so aus, als solltest du dein Datenbankdesign nochmal überdenken ... |
Re: Eine etwas komplexere Sortierung
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. Der Screenshot war nur ein Beispiel. Die Tabelle sieht etwas anders aus und hat schon so ihren Sinn :) |
Re: Eine etwas komplexere Sortierung
Versuch's mal mit der Function IsNull des SQL Servers das Konstrukt sähe dann etwa so aus:
SQL-Code:
Nicht getestet!
...
ORDER BY IsNull(Name1, IsNull(Name2, IsNull(Name3, IsNull(Name4, Name5)))) Grüße Mikhal |
Re: Eine etwas komplexere Sortierung
Oder mit coalesce... ist einfacher:
SQL-Code:
select * from tabelle order by coalesce (feld1,feld2,feld3,feld4,feld5)
|
Re: Eine etwas komplexere Sortierung
Leider sortiert er bei beiden Methoden wieder vorrangig nach Feld1...
Es geht halt um folgendes: 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). Ist leider schwieriger zu erklären als ich dachte, aber ich hoffe so versteht man es ein wenig besser ^^ |
Re: Eine etwas komplexere Sortierung
Aha, pro Eintrag in Feld1...Feld5 eine Zeile im Resultat.
SQL-Code:
select * from tabelle where feld1 is not null
union select * from tabelle where feld2 is not null union select * from tabelle where feld3 is not null union select * from tabelle where feld4 is not null union select * from tabelle where feld5 is not null order by coalesce (feld1,feld2,feld3,feld4,feld5) |
Re: Eine etwas komplexere Sortierung
Nur mal so als Anmerkung. Könnte es sein, dass die Datenbank schlecht designt ist? Oder warum hast du in einem Datensatz 5 Vornamen, wenn dann sowieso wieder nach jedem Vornamen einzeln sortiert werden soll ...
|
Re: Eine etwas komplexere Sortierung
Jens hat es schon in Beitrag #2 angedeutet - die Tabelle ist nicht in der ersten Normalform. Die Wiederholungsgruppe muss zuerst aufgelöst werden:
SQL-Code:
Grüße vom marabu
select name1 as name, * from tabelle where name1 is not null
union select name2 as name, * from tabelle where name2 is not null union select name3 as name, * from tabelle where name3 is not null union select name4 as name, * from tabelle where name4 is not null union select name5 as name, * from tabelle where name5 is not null order by name |
Re: Eine etwas komplexere Sortierung
Zitat:
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. |
Re: Eine etwas komplexere Sortierung
ich habe es mal versucht so auf meine Tabellen anzuwenden:
exklusives Beispiel:
SQL-Code:
allerdings spuckt er mir so nur ein Feld mit dem Namen aus, nicht alle 3.
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 edit: 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 :) |
Re: Eine etwas komplexere Sortierung
Ich habe mal zwei Tabellen erzeugt:
SQL-Code:
CREATE TABLE [dbo].[Vertraege] (
[ID] [int] IDENTITY (1, 1) NOT NULL , [DATUM] [datetime] NOT NULL , [P1] [int] NULL , [P2] [int] NULL , [P3] [int] NULL )
Code:
// Vertraege
1 2006-05-17 00:00:00.000 1 NULL NULL 2 2006-05-17 00:00:00.000 2 3 NULL
SQL-Code:
CREATE TABLE [dbo].[Personen] (
[ID] [int] IDENTITY (1, 1) NOT NULL , [NAME] [nvarchar] (50) COLLATE Latin1_General_CI_AS NULL )
Code:
Hier die Abfrage:
// Personen
1 Müller 2 Meier 3 Schulze
SQL-Code:
Geliefert wird dann:
select name, v.*
from vertraege v join personen p on v.p1 = p.id UNION select name, v.* from vertraege v join personen p on v.p2 = p.id UNION select name, v.* from vertraege v join personen p on v.p3 = p.id
Code:
marabu
Meier 2 2006-05-17 00:00:00.000 2 3 NULL
Müller 1 2006-05-17 00:00:00.000 1 NULL NULL Schulze 2 2006-05-17 00:00:00.000 2 3 NULL |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz