Seite 1 von 2

Top 10 liste machen

Verfasst: Sa 21. Nov 2015, 17:01
von Atwist
Hallo,

Ich mochte gerne eine Top 10 liste filter machen, Problem ist dass ich nicht weiß wie ich dass machen soll.

Was ich sehen will ist von einen bestimmtes Jahr, zum Beispiel 2006.

Platz Artiest Song Jaar
1 Oueen / Bohemian Rhapsody / 1975
2 Boudewijn de Groot / Avond / 1997
3 Eagles / Hotel California / 1977

Wie muss ich dass machen.

Der Link nach Datei https://copy.com/8IVYteUnJ0tWNpCY

Re: Top 10 liste machen

Verfasst: Sa 21. Nov 2015, 22:46
von gogo
Für 2006

Code: Alles auswählen

SELECT "artiest", "titel", "2006" FROM "Lijst" ORDER BY "2006" DESC limit 10
Falls Du was flexibleres brauchst, musst Du umcodiern:

Z.B. mit einer Tabelle:
ID, artiest, titel, jahr, rank_jahr, rank
2172, Billy Joel, James, 2005, 1666
2173, Billy Joel, James, 2006, 1998
2174, Billy Joel, James, 2007, 1887
2175, Billy Joel, James, 2008, 1811
...

Code: Alles auswählen

SELECT "artiest", "titel", "rank" FROM "Lijst" WHERE "rank_jahr"= :welches_Jahr ORDER BY "rank" DESC limit 10

Re: Top 10 liste machen

Verfasst: Sa 21. Nov 2015, 23:22
von F3K Total
Habe die Tabelle geteilt und so alle Titel untereinander geschrieben, dann geht es ganz leicht.
Gruß R

Re: Top 10 liste machen

Verfasst: So 22. Nov 2015, 08:31
von Atwist
@ gogo

Vielen dank für diese Lösung dem Befehl "DESC limit" kante ich nicht.
Ich brachte etwas zeit um deine Lösung zu verstehen, aber es hat geklappt .

Danke

@ F3K Total

Das ist ja eine komplett Lösung muss jetzt mal sehen was Du alles gemacht hast es ist viel geändert jetzt muss ich noch verstehen wie dass alles funktioniert.

Aber bin sehr froh mit diese Lösung.

DANKE

Re: Top 10 liste machen

Verfasst: So 22. Nov 2015, 10:43
von F3K Total
Atwist hat geschrieben:... muss jetzt mal sehen was Du alles gemacht hast es ist viel geändert jetzt muss ich noch verstehen wie dass alles funktioniert.
Hi,
ich versuche mal das wichtigste zu erklären.
Zunächst habe ich noch eine Änderung durchgeführt, VALUE heißt nun RANK.
Damit du nachvollziehen kannst, was ich gemacht habe, anbei deine Originaldatei, ohne Änderungen an den Tabellen.
Das schwierigste ist, aus deiner Tabellenmatrix, wo die Jahre nebeneinander angeordnet sind, eine Tabelle zu machen, in der alle Werte untereinander angeordnet sind. So ist es möglich mit einem Suchbegriff alle Werte zu filtern.
Führe EINMAL über Extras/SQL... die folgenden Befehle aus (Copy/Paste -> Ausführen):

Code: Alles auswählen

CREATE TABLE "RANK_JAAR"("JAAR" INTEGER NOT NULL,"FK_ID" INTEGER NOT NULL,"RANK" INTEGER,PRIMARY KEY("JAAR","FK_ID"));
ALTER TABLE "RANK_JAAR" ADD CONSTRAINT FKIDTITEL FOREIGN KEY("FK_ID") REFERENCES "Lijst"("ID") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "zoekfilter" ADD COLUMN "F-Top-jaar" INTEGER
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 1999, ID, "1999" FROM "Lijst" WHERE "1999" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2000, ID, "2000" FROM "Lijst" WHERE "2000" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2001, ID, "2001" FROM "Lijst" WHERE "2001" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2002, ID, "2002" FROM "Lijst" WHERE "2002" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2003, ID, "2003" FROM "Lijst" WHERE "2003" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2004, ID, "2004" FROM "Lijst" WHERE "2004" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2005, ID, "2005" FROM "Lijst" WHERE "2005" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2006, ID, "2006" FROM "Lijst" WHERE "2006" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2007, ID, "2007" FROM "Lijst" WHERE "2007" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2008, ID, "2008" FROM "Lijst" WHERE "2008" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2009, ID, "2009" FROM "Lijst" WHERE "2009" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2010, ID, "2010" FROM "Lijst" WHERE "2010" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2011, ID, "2011" FROM "Lijst" WHERE "2011" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2012, ID, "2012" FROM "Lijst" WHERE "2012" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2013, ID, "2013" FROM "Lijst" WHERE "2013" > 0;
INSERT INTO RANK_JAAR (JAAR, FK_ID, RANK) SELECT 2014, ID, "2014" FROM "Lijst" WHERE "2014" > 0;
ALTER TABLE "Lijst" DROP "1999";
ALTER TABLE "Lijst" DROP "2000";
ALTER TABLE "Lijst" DROP "2001";
ALTER TABLE "Lijst" DROP "2002";
ALTER TABLE "Lijst" DROP "2003";
ALTER TABLE "Lijst" DROP "2004";
ALTER TABLE "Lijst" DROP "2005";
ALTER TABLE "Lijst" DROP "2006";
ALTER TABLE "Lijst" DROP "2007";
ALTER TABLE "Lijst" DROP "2008";
ALTER TABLE "Lijst" DROP "2009";
ALTER TABLE "Lijst" DROP "2010";
ALTER TABLE "Lijst" DROP "2011";
ALTER TABLE "Lijst" DROP "2012";
ALTER TABLE "Lijst" DROP "2013";
ALTER TABLE "Lijst" DROP "2014";
ALTER TABLE "Lijst" DROP "2015";
ALTER TABLE "Lijst" DROP "2016";
CHECKPOINT DEFRAG
Dann in den Bereich der Tabellen wechseln und Menü Ansicht/Tabellen aktualisieren

Was passiert:
  • Code: Alles auswählen

    CREATE TABLE "RANK_JAAR" ...
    ...erzeugt die neue Tabelle RANK_JAAR
  • Code: Alles auswählen

    ALTER TABLE "RANK_JAAR" ...
    ...erzeugt die Beziehung, die du unter Extras/Beziehungen sehen kannst
  • Code: Alles auswählen

    ALTER TABLE "zoekfilter" ADD COLUMN
    ...erzeugt eine zusätzlich Spalte in der Tabelle "zoekfilter"
  • Code: Alles auswählen

    INSERT INTO RANK_JAAR ...
    ...fügt nun die Werte der Spalten 1999-2016 deiner Tabelle "Lijst" untereinander in die neue Tabelle ein
  • Code: Alles auswählen

    ALTER TABLE "Lijst" DROP ...
    ...löscht anschließend die Spalten 1999-2016 aus deiner Tabelle "Lijst"
  • Code: Alles auswählen

    CHECKPOINT DEFRAG
    komprimiert die Datenbank
Das neue Formular
  • Zoekscherm_F3K
und die Abfragen
  • q_Top2000
  • Qzoekfilter1_F3K
habe ich schon eingebaut, ab jetzt müssten sie auch funktionieren.

Versuchs mal, aber unbedingt mit angehängten Beispiel.
Gruß R

Re: Top 10 liste machen

Verfasst: So 22. Nov 2015, 13:54
von Atwist
Ich finde es immer noch schwierig zu verstehen was Du gemacht hast, dafür sind meine Kenntnisse von Base zu niedrig war schon froh das ich soweit gekommen bin :? .

Mit deine Erklärung versuch ich mich schlau zu machen.

Aber Du machst schöne Sachen .

Habe Deine Datei versucht und habe etwas gefunden was nicht stimmt, ich bekomme keine Auskunft bei die Value im mittlere Tabelle.
Und was ich noch nicht verstehen kann ist wie ich die ranking von 2015 eingeben kann (die ranking ist noch nicht bekannt)
Schermafdruk.png
Schermafdruk.png (93.3 KiB) 3598 mal betrachtet

Re: Top 10 liste machen

Verfasst: So 22. Nov 2015, 14:29
von F3K Total
Hallo, da habe ich vergessen VALUE durch RANK zu ersetzen:
Rechtsklick auf das Formular Zoekscherm_F3K Bearbeiten, Rechtsklick auf Spaltenkopf VALUE -> Spalte.../Reiter Daten -> Datenfeld -> wähle RANK -> Formular speichern -> Datenbank speichern
Gruß R

Re: Top 10 liste machen

Verfasst: So 22. Nov 2015, 15:18
von Atwist
Und was ich noch nicht verstehen kann ist wie ich die ranking von 2015 eingeben kann (die ranking ist noch nicht bekannt)
Dass ging noch einfach und habe auch gesehen dass die Jahr liste automatisch wird angepasst so langsam an verstehe ich die Aufbau und die Filters.

Ich bedanke mich bei dir

VIELEN DANK

Re: Top 10 liste machen

Verfasst: So 22. Nov 2015, 15:24
von gogo
Atwist hat geschrieben:... dem Befehl "DESC limit" kante ich nicht...
den gibt's auch nicht ;)

DESC bezieht sich auf ORDER BY und definiert ob absteigend oder aufsteigend sortiert wird. Der "ORDER BY"-Befehl wird standardmäßig als ASC (ascending) ausgeführt. Man muss also nicht "ORDER BY MeinFeld ASC" schreiben wenn man eine aufsteigende Sortierung wünscht. Für absteigende Sortierungen braucht's aber das DESC.

LIMIT m (bzw. LIMIT m OFFSET n)(*) ist eine eigenständige SQL-Anweisung, die den Server anweist nur m Zeilen zu suchen und dann aufzuhören. Dabei ist es wichtig zu wissen , dass es bei ex-aequo-Ergebnissen KEINE Regel gibt welcher Datensatz auf Platz 10 landet und welcher auf 11! Der elfte Datensatz wird natürlich NICHT geliefert, LIMIT 10 ist eben LIMIT 10.
Um alle ex-aeqo-Ergebnisse für Platz 10 zu sehen muss man etwa so vorgehen:

Code: Alles auswählen

Select * from TabelleX 
  where Rang >= (select Rang from TabelleX order by Rang desc LIMIT 1 OFFSET 9
                 )
   order by Rang desc;
Wobei die Sub-Query "select Rang from TabelleX order by Rang desc limit 1 OFFSET 9" den Wert des Feldes "Rang" des 10. Datensatzes ausgibt (Zählung beginnt bei 0!)

Anmerkung:
(*): OFFSET n bedeutet, dass n die Zeilen übersprungen werden und erst m Datensätze ab Zeile n+1 ausgegeben werden (siehe HSQL-DB-Doku). Das Schlüsselwort "OFFSET" ist bei der HSQLDB die bei LO 4.0.4. eingesetzt wird ein Muss! Ein Leerzeichen oder Komma (wie in MySQL) genügt nicht!

Re: Top 10 liste machen

Verfasst: So 22. Nov 2015, 22:38
von F3K Total
Atwist hat geschrieben:Und was ich noch nicht verstehen kann ist wie ich die ranking von 2015 eingeben kann
Wenn du die Ergebnisse von 2015 hast z.B. als Calc oder .csv, komm wieder, das geht mit ein paar SQL-Befehlen ...
R