Auf und Abstieg oder Position gehalten einbauen

Du kannst statt
Code:
ROW_NUMBER() OVER ()
mal nur
Code:
ROW_NUMBER
probieren. Ich kann das nur anhand der Doku raten aber die Syntax-Fehler musst du schon selbst debuggen, ein HSQL habe ich nicht.
 
Werbung:
Du hast in deinem ersten Screenshot eine Spalte Platz, ich glaube das ist eine View. Da müsstest du mal schauen wie diese Spalte erstellt wurde. Das wird dir hierbei helfen und auch bei deinem folge Post.
 
Hallo es sind 4 Tabellen

tbl_Spiele
HID, AID, Datum, HTore, ATore

tbl_Vereine
ID, Verein

viw_Punkte (Inhalt)
SELECT "a"."Verein", SUM("Spiele") AS "Spiele", SUM("Siege") AS "Siege", SUM("Unentschieden") AS "Unentschieden", SUM("Verloren") AS "Verloren", SUM("Tore") AS "Tore", SUM("Gegentore") AS "Gegentore", SUM("Punkte") AS "Punkte" FROM
(SELECT "HVerein" AS "Verein", COUNT("Datum") AS "Spiele", COUNT("HSieg") AS "Siege", COUNT("HUnentschieden") AS "Unentschieden", COUNT("HVerloren") AS "Verloren", SUM("HTore") AS "Tore", SUM("ATore") AS "Gegentore", SUM("HPunkte") AS "Punkte" FROM "viw_Spielplan" GROUP BY "HVerein"
UNION ALL
SELECT "AVerein" AS "Verein", COUNT("Datum") AS "Spiele", COUNT("ASieg") AS "Siege", COUNT("AUnentschieden") AS "Unentschieden", COUNT("AVerloren") AS "Verloren", SUM("ATore") AS "Tore", SUM("HTore") AS "Gegentore", SUM("APunkte") AS "Punkte" FROM "viw_Spielplan" GROUP BY "AVerein") AS "a"
GROUP BY "a"."Verein"

view_Spielplan (Inhalt)
SELECT "HID", "AID", ( SELECT "Verein" FROM "tbl_Vereine" WHERE "ID" = "a"."HID" ) AS "HVerein", ( SELECT "Verein" FROM "tbl_Vereine" WHERE "ID" = "a"."AID" ) AS "AVerein", "Datum", "HTore", "ATore", CASE WHEN "a"."HTore" > "a"."ATore" THEN 3 WHEN "a"."HTore" = "a"."ATore" THEN 1 ELSE 0 END AS "HPunkte", CASE WHEN "a"."ATore" > "a"."HTore" THEN 3 WHEN "a"."HTore" = "a"."ATore" THEN 1 ELSE 0 END AS "APunkte", CASE WHEN "a"."HTore" > "a"."ATore" THEN 1 END AS "HSieg", CASE WHEN "a"."ATore" > "a"."HTore" THEN 1 END AS "ASieg", CASE WHEN "a"."HTore" = "a"."ATore" THEN 1 END AS "HUnentschieden", CASE WHEN "a"."ATore" = "a"."HTore" THEN 1 END AS "AUnentschieden", CASE WHEN "a"."HTore" < "a"."ATore" THEN 1 END AS "HVerloren", CASE WHEN "a"."ATore" < "a"."HTore" THEN 1 END AS "AVerloren" FROM "tbl_Spiele" AS "a"
 
Erster Post in diesem Thread, erster Screenshot, erste Spalte "Platz", wo kommt die her wie entsteht die? Das Wort "Platz" ist in deiner View viw_Punkte wie hier beschrieben nicht enthalten.
 
Hallo der Platz entsteht in der Abfrage (qry_Tabellenplatzierung)

SELECT ( SELECT COUNT( "Tore" ) FROM "viw_Punkte" WHERE "Punkte" > "a"."Punkte" OR ( "Punkte" = "a"."Punkte" AND "Tore" > "a"."Tore" ) OR ( "Punkte" = "a"."Punkte" AND "Tore" = "a"."Tore" AND "Tore" - "Gegentore" > "a"."Tore" - "a"."Gegentore" ) ) + 1 AS "Platz", "Verein", "Spiele", "Siege", "Unentschieden", "Verloren", "Tore", "Gegentore", "Punkte", "a"."Tore" - "a"."Gegentore" AS "Tordifferenz" FROM "viw_Punkte" AS "a" ORDER BY "Punkte" DESC, "Tore" DESC, "Gegentore" ASC, "Tordifferenz" ASC
 
Hallo der Platz entsteht in der Abfrage (qry_Tabellenplatzierung)

SELECT ( SELECT COUNT( "Tore" ) FROM "viw_Punkte" WHERE "Punkte" > "a"."Punkte" OR ( "Punkte" = "a"."Punkte" AND "Tore" > "a"."Tore" ) OR ( "Punkte" = "a"."Punkte" AND "Tore" = "a"."Tore" AND "Tore" - "Gegentore" > "a"."Tore" - "a"."Gegentore" ) ) + 1 AS "Platz", "Verein", "Spiele", "Siege", "Unentschieden", "Verloren", "Tore", "Gegentore", "Punkte", "a"."Tore" - "a"."Gegentore" AS "Tordifferenz" FROM "viw_Punkte" AS "a" ORDER BY "Punkte" DESC, "Tore" DESC, "Gegentore" ASC, "Tordifferenz" ASC
In sofern erhellend als das du keinerlei Window-Funktionen verwendet hast, vermutlich geht es also gar nicht in HSQL.

Etwas besser formatiert hast du:
Code:
SELECT    (    SELECT    COUNT( "Tore" )
            FROM    "viw_Punkte"
            WHERE    "Punkte" > "a"."Punkte"
            OR        ( "Punkte" = "a"."Punkte"
            AND        "Tore" > "a"."Tore" )
            OR        ( "Punkte" = "a"."Punkte"
            AND        "Tore" = "a"."Tore"
            AND        "Tore" - "Gegentore" > "a"."Tore" - "a"."Gegentore" ) ) + 1 AS "Platz",
        "Verein",
        "Spiele",
        "Siege",
        "Unentschieden",
        "Verloren",
        "Tore",
        "Gegentore",
        "Punkte",
        "a"."Tore" - "a"."Gegentore" AS "Tordifferenz"
FROM    "viw_Punkte" AS "a"
ORDER BY "Punkte" DESC, "Tore" DESC, "Gegentore" ASC, "Tordifferenz" ASC
...also ein Subselect der die Platzierung ermittelt. Um jetzt die Platzierung vom Vortag zu ermitteln müsstest du das Datum mit einbeziehen, das dürfte in deiner viw_Punkte nicht enthalten sein, scheint aber in viw_Spielplan drin zu stecken. Um von der viw_Spielplan auf das gewünschte Ergebnis zu kommen brauche ich mindestens noch eine View als Zwischenschritt, sonst ist das viel zu viel unüberschaubarer Code mit den einfachen Mitteln von HSQL.

viw_Spiele
Code:
SELECT    HID AS ID,
        HVerein AS Verein,
        Datum,
        1 AS Spiele,
        1 AS Siege,
        0 AS Unentschieden,
        0 AS Verloren,
        HTore AS Tore,
        ATore AS Gegentore,
        3 AS Punkte
FROM    viw_Spielplan
WHERE    HSieg = 1
UNION ALL
SELECT    HID AS ID,
        HVerein AS Verein,
        Datum,
        1 AS Spiele,
        0 AS Siege,
        1 AS Unentschieden,
        0 AS Verloren,
        HTore AS Tore,
        ATore AS Gegentore,
        1 AS Punkte
FROM    viw_Spielplan
WHERE    HUnentschieden = 1
UNION ALL
SELECT    HID AS ID,
        HVerein AS Verein,
        Datum,
        1 AS Spiele,
        0 AS Siege,
        0 AS Unentschieden,
        1 AS Verloren,
        HTore AS Tore,
        ATore AS Gegentore,
        0 AS Punkte
FROM    viw_Spielplan
WHERE    HVerloren = 1
UNION ALL
SELECT    AID AS ID,
        AVerein AS Verein,
        Datum,
        1 AS Spiele,
        1 AS Siege,
        0 AS Unentschieden,
        0 AS Verloren,
        ATore AS Tore,
        HTore AS Gegentore,
        3 AS Punkte
FROM    viw_Spielplan
WHERE    ASieg = 1
UNION ALL
SELECT    AID AS ID,
        AVerein AS Verein,
        Datum,
        1 AS Spiele,
        0 AS Siege,
        1 AS Unentschieden,
        0 AS Verloren,
        ATore AS Tore,
        HTore AS Gegentore,
        1 AS Punkte
FROM    viw_Spielplan
WHERE    AUnentschieden = 1
UNION ALL
SELECT    AID AS ID,
        AVerein AS Verein,
        Datum,
        1 AS Spiele,
        0 AS Siege,
        0 AS Unentschieden,
        1 AS Verloren,
        ATore AS Tore,
        HTore AS Gegentore,
        0 AS Punkte
FROM    viw_Spielplan
WHERE    AVerloren = 1
Dadrauf kann man dann diese Abfrage machen:
Code:
SELECT    (    SELECT    count(r1.ID) + 1
            FROM    (    SELECT    ID,
                                sum(Tore) AS Tore,
                                sum(Punkte) AS Punkte,
                                sum(Tore) - sum(Gegentore) AS Tordifferenz
                        FROM    viw_Spiele r0
                        GROUP BY ID,Verein ) r1
            WHERE    r1.Punkte >= sum(viw_Spiele.Punkte)
            AND        r1.Tordifferenz >= sum(viw_Spiele.Tore) - sum(viw_Spiele.Gegentore)
            AND        r1.Tore >= sum(viw_Spiele.Tore)
            ) AS Platz,
        (    SELECT    count(r3.ID) + 1
            FROM    (    SELECT    ID,
                                sum(Tore) AS Tore,
                                sum(Punkte) AS Punkte,
                                sum(Tore) - sum(Gegentore) AS Tordifferenz
                        FROM    viw_Spiele r2
                        WHERE    r2.Datum < viw_Spiele.Datum
                        GROUP BY ID,Verein ) r3
            WHERE    r3.Punkte >= sum(viw_Spiele.Punkte)
            AND        r3.Tordifferenz >= sum(viw_Spiele.Tore) - sum(viw_Spiele.Gegentore)
            AND        r3.Tore >= sum(viw_Spiele.Tore)
            ) AS Vorplatz,
        ID,
        Verein,
        sum(Spiele) AS Spiele,
        sum(Siege) AS Siege,
        sum(Unentschieden) AS Unentschieden,
        sum(Verloren) AS Verloren,
        sum(Tore) AS Tore,
        sum(Gegentore) AS Gegentore,
        sum(Punkte) AS Punkte,
        sum(Tore) - sum(Gegentore) AS Tordifferenz
FROM    viw_Spiele
GROUP BY ID,Verein
Das sollte in etwa dem entsprechen, was du suchst.

- Einen Fehler habe ich behoben: Die Tordifferenz ist wichtiger als die geschossenen Tore.
- Verbleibendes Problem #1: Wenn bei dir mehrere Mannschaften Platzgleich sind, sich also einen Platz teilen, wird der bei dir den falschen Rang haben. Wenn z.B. zwei Mannschaften an der Spitze identisch sind, müssten sie beide den Platz 2 haben, nicht 1. Könnte man eventuell mit count(DISTINCT ) oder einen Zwischenschritt lösen aber das würde ich vernachlässigen.
- Verbleibendes Problem #2: Du hast nur das Kalenderdatum aber keinen Spieltag. Du kannst immer nur zwischen Kalendertag und Vortag unterscheiden, nicht ziwschen Spieltagen. Das ist mit der Datenbasis nicht möglich.
 
Hallo, habe heute v_qry_Spielplan und viw_Spiel erstellt.

v_qry_Spielplan
HID, AID, Datum, HVerein, AVerein, HTore, ATore, HPunkte, APunkte, HSieg, ASieg, HUnentschieden, AUnentschieden, HVerloren, AVerloren
erstellt.

viw_Spiel (In der viw habe ich den Code eingetragen)
SELECT HID AS ID,
HVerein AS Verein,
Datum,
1 AS Spiele,
1 AS Siege,
0 AS Unentschieden,
0 AS Verloren,
HTore AS Tore,
ATore AS Gegentore,
3 AS Punkte
FROM viw_Spielplan
WHERE HSieg = 1
UNION ALL
SELECT HID AS ID,
HVerein AS Verein,
Datum,
1 AS Spiele,
0 AS Siege,
1 AS Unentschieden,
0 AS Verloren,
HTore AS Tore,
ATore AS Gegentore,
1 AS Punkte
FROM viw_Spielplan
WHERE HUnentschieden = 1
UNION ALL
SELECT HID AS ID,
HVerein AS Verein,
Datum,
1 AS Spiele,
0 AS Siege,
0 AS Unentschieden,
1 AS Verloren,
HTore AS Tore,
ATore AS Gegentore,
0 AS Punkte
FROM viw_Spielplan
WHERE HVerloren = 1
UNION ALL
SELECT AID AS ID,
AVerein AS Verein,
Datum,
1 AS Spiele,
1 AS Siege,
0 AS Unentschieden,
0 AS Verloren,
ATore AS Tore,
HTore AS Gegentore,
3 AS Punkte
FROM viw_Spielplan
WHERE ASieg = 1
UNION ALL
SELECT AID AS ID,
AVerein AS Verein,
Datum,
1 AS Spiele,
0 AS Siege,
1 AS Unentschieden,
0 AS Verloren,
ATore AS Tore,
HTore AS Gegentore,
1 AS Punkte
FROM viw_Spielplan
WHERE AUnentschieden = 1
UNION ALL
SELECT AID AS ID,
AVerein AS Verein,
Datum,
1 AS Spiele,
0 AS Siege,
0 AS Unentschieden,
1 AS Verloren,
ATore AS Tore,
HTore AS Gegentore,
0 AS Punkte
FROM viw_Spielplan
WHERE AVerloren = 1

Aber die viw_Spiel zeigt mir nichts an, nur was im Bild zu sehen ist.
 

Anhänge

  • 6456452131231.jpg
    6456452131231.jpg
    5,9 KB · Aufrufe: 4
Die Abfrage:
SELECT ( SELECT count(r1.ID) + 1
FROM ( SELECT ID,
sum(Tore) AS Tore,
sum(Punkte) AS Punkte,
sum(Tore) - sum(Gegentore) AS Tordifferenz
FROM viw_Spiele r0
GROUP BY ID,Verein ) r1
WHERE r1.Punkte >= sum(viw_Spiele.Punkte)
AND r1.Tordifferenz >= sum(viw_Spiele.Tore) - sum(viw_Spiele.Gegentore)
AND r1.Tore >= sum(viw_Spiele.Tore)
) AS Platz,
( SELECT count(r3.ID) + 1
FROM ( SELECT ID,
sum(Tore) AS Tore,
sum(Punkte) AS Punkte,
sum(Tore) - sum(Gegentore) AS Tordifferenz
FROM viw_Spiele r2
WHERE r2.Datum < viw_Spiele.Datum
GROUP BY ID,Verein ) r3
WHERE r3.Punkte >= sum(viw_Spiele.Punkte)
AND r3.Tordifferenz >= sum(viw_Spiele.Tore) - sum(viw_Spiele.Gegentore)
AND r3.Tore >= sum(viw_Spiele.Tore)
) AS Vorplatz,
ID,
Verein,
sum(Spiele) AS Spiele,
sum(Siege) AS Siege,
sum(Unentschieden) AS Unentschieden,
sum(Verloren) AS Verloren,
sum(Tore) AS Tore,
sum(Gegentore) AS Gegentore,
sum(Punkte) AS Punkte,
sum(Tore) - sum(Gegentore) AS Tordifferenz
FROM viw_Spiele
GROUP BY ID,Verein

Schlägt Fehlermeldung. Siehe Bild
 

Anhänge

  • 23134354623434.jpg
    23134354623434.jpg
    111,1 KB · Aufrufe: 3
Werbung:
Wenn die View schon fehl schlägt weiß ich auch nicht weiter. Funktioniert die denn als Abfrage? Bekommst du irgendwo Syntax-Fehler?

Such dir am besten eine weniger exotische DB, vor allem eine die sinnvolle Syntax-Fehler meldet. Was mich und HSQL angeht gebe ich auf.
 
Zurück
Oben