Seite 1 von 1

Abfrage benutzerdefiniert sortieren

Verfasst: Mo 13. Nov 2017, 17:40
von Libreferdi
Hallo zusammen

ich habe folgendes Problem.
Da gibt es eine Tabelle in der stehen ganz viel Chormitglieder und ehemalig Sänger drin.
Nun gibt es auch eine Spalte in der steht auch drin welche Stimme der Sänger hat.
Mach ich nun eine Abfrage kann ich nicht die Abfrage so sortieren das der Sopran , dann Sopran 1 und zum Schluss der Bass da ist,
da man nur auf und absteigend sortieren kann.
Meine Frage könnte ich in der SQL-Abfrage da so etwas reinschreiben?

LG Ferdi

Re: Abfrage benutzerdefiniert sortieren

Verfasst: Mo 13. Nov 2017, 18:52
von gogo
Mach' ein zusätzliches Feld "Sortierung", nur zum sortieren. Da bekommt dann der "Sopran 1" eine 1, "Sopran 2" eine 2, "Alt 1" die 3 ...
Umständlich, aber Kategorien lassen sich so am besten sortieren.
Das wäre das einfachste.
mit

Code: Alles auswählen

update tsaenger set Sortierung = "1" where Stimme like "%sopran%"
... oder so ähnlich kannst Du alle Soprane auf "1" setzen . ohne dass Du Dir die Finger wund tippen musst.

Komplexer wäre eine 2. Tabelle in der Du die "Stimme" aus "tsaenger" dynamisch mit einem Index verbindest - ich nehme mal an, dass das den Aufwand nicht lohnt, vor allem wenn die Tabelle schon getippt ist.

Re: Abfrage benutzerdefiniert sortieren

Verfasst: Mo 13. Nov 2017, 19:38
von Libreferdi
Coole Idee aber etwas umständlich, hat funktioniert, nur was ich halt suche war die Möglichkeit bei der Sortierung nicgt auf und absteigend einzugeben sondern
'Sopran, Alt Tenor Bass,
aber muß ich wohl erst noch warten, bei Calk geht das nämlich.
Trotzdem danke
LG Ferdi

Re: Abfrage benutzerdefiniert sortieren

Verfasst: Mo 13. Nov 2017, 20:50
von gogo
da wartest Du lange, denn sql-basierte Datenbanken werden nicht für solche Fälle programmiert.
Wenn Du Kategorien hast, dann sind das eben "normalisierte" Daten und die sind per Definition "nicht metrisch" d.h. unsortiert. Korrekterweise sortiert man da indem man eine 2. Tabelle macht, welche die Kategorien beinhaltet. Deren Primärschlüssel ist der Fremdschlüssel der Daten-Tabelle, das Sortier-Feld befindet sich in der Kategorien-Tabelle. In der Abfrage verwendet man dann einen Join und passt. - Ich vermute mal, dass Calc das intern genau so macht - immerhin haben das Informatiker programmiert ;)

Code: Alles auswählen

Select saenger.* from saenger join stimmen on saenger.StimmID = stimmen.StimmID order by stimmen.Sortierung

Re: Abfrage benutzerdefiniert sortieren

Verfasst: Mo 13. Nov 2017, 21:32
von RobertG
Eine direkte Abfrage geht hier ja nicht. Irgendwo muss die Sortierung vordefiniert sein. Für den einfachsten Fall würde ich eine neue Tabelle "Stimmen" erstellen, in der ein Feld "Stimme" (als Primärschlüssel, Textfeld) und ein Feld "Sort" steht.

Die Belegung für das Feld "Stimme" würde ich mir aus der Sängertabelle rausziehen:

Code: Alles auswählen

SELECT DISTINCT "Stimme" FROM "Saenger"
Diese Abfrage dann nehmen und den Inhalt kopieren und in die neue Tabelle einfügen. Dann noch die gewünschte Sortierung ausfüllen und so weiter verfahren, wie es Gogo bereits in seinem Beitrag geschrieben hat.

So eine Sortierung muss ja irgendwo hinterlegt werden. In Calc kann das irgendwo in der Datei sein, in einer Datenbank dann eben irgendwo in einer Tabelle, das die Datenbank auf andere Elemente der *.odb-Datei keinen Zugriff für seinen SQL-Code hat.

Gruß

Robert

Re: Abfrage benutzerdefiniert sortieren

Verfasst: Mo 13. Nov 2017, 22:47
von gogo
ok - es geht doch mit einer direkten Abfrage, aber kompliziert:
Das SQL-Kommando lautet "UNION ALL" und zusätzlich braucht man generierte Felder:

Sieh' Dir die Beispieldatenbank an das wäre die Tabelle:
Screenshot_20171113_223924.png
Screenshot_20171113_223924.png (18.6 KiB) 3767 mal betrachtet
und das die Abfrage die's tut:

Code: Alles auswählen

select "SName", '1' as "ORD" from "saenger" where "Stimme" = 'Sopran'  
UNION ALL 
select "SName", '2' as "ORD"  from "saenger" where "Stimme" = 'Alt'
UNION ALL 
select "SName", '3' as "ORD"  from "saenger" where "Stimme" = 'Tenor' 
UNION ALL
select "SName", '4' as "ORD"  from "saenger" where "Stimme" = 'Bass'

order by "ORD","SName"
Resultat:
Screenshot_20171113_224212.png
Screenshot_20171113_224212.png (6.67 KiB) 3767 mal betrachtet
... für 4 Stimmen ist das noch durchführbar - für ein Orchester mit vielen Registern wird's schon schwieriger - aber Musiker sind ja komplexe Notierungen gewohnt :lol: