Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Kreuztabelle

Begonnen von Waldis, August 22, 2016, 21:44:51

⏪ vorheriges - nächstes ⏩

Waldis

Guten Abend,

da bin ich schon wieder. Langsam wird's mir schon fast peinlich, aber ich probier schon den ganzen Tag rum. :/
Ohne VBA Kenntnisse wird mein Gebastel doch recht schwierig...

Ich hab eine Tabelle mit den Spalten und Beispielwerten:

ergebnis_id |starter_id |veranstaltung_id |ergebnis
11190
21188
32188
42197
52189

Nun sollen die Ergebnisse in Spalten dargestellt werden.
Davor noch sortieren, damit je Starter das beste Ergebnis in der 1. Spalte ist, das 2. in der 2. usw. Da bei der Rangliste die jeweils besten Ergebnisse verglichen werden.

Aussehen soll das Ganze dann so:

starter_id |veranstaltung_id |ergebnis1 |ergebnis2 |ergebnis3
119088
21978988

Das es Kreuztabellen gibt, hab ich schon gesehen.
Allerdings funktioniert das in meinem Fall nicht, da die Ergebnis_ID über mehrere Starter hinweg läuft.


Er macht mir daher nur so etwas:

starter_id |veranstaltung_id |ergebnis1 |ergebnis2 |ergebnis3 |ergebnis4 |ergebnis5
119088
21889789

Eine Nummerierung wie bei donkarl hab ich probiert und ein wenig abgewandelt. Das hat auch fast funktioniert. Er fängt bei jedem Starter von 1 an und zählt durch. (Somit könnte ich die besten Ergebnisse per Kreuztabelle darstellen)
Bei gleichen Ergebnissen zählt er aber nicht weiter...
Außerdem meckert die Kreuztabelle, weil die Subquery als unbekannten Parameter sieht oder so.

Was funktioniert, war eine Abfrage mit Übergabe eines Parameters (starter_id), welche z. B. nur Ergebnisse vom Starter 1 zeigt.
Mit einer 2. Abfrage konnte ich es dann mit der Methode von donkarl nummerieren (da ohne fremde Starter) und als Kreuztabelle darstellen.

Ich hab auch gesehen, dass man den Parameter automatisch über ein Textfeld übergeben kann.
Aber für die Rangliste, die ich über einen Bericht machen will, bringt mir das nicht viel. Dort müssen ja dann alle Starter drauf sein.

Gibt es vielleicht eine Möglichkeit, die Kreuztabelle mit Parameter im Bericht automatisch für jeden Starter als Schleife laufen zu lassen? Oder eine Abfrage als Schleife?

Kann mir da nochmal einer helfen. Ich hoffe, es ist halbwegs verständlich erklärt.

Hier noch ein Screenshot, wie die PHP-Webanwendung aussieht:


Edit:
Ich könnte auch einfach eine Tabelle mit 10 Spalten "S1", "S2"... anlegen. Allerdings sind die maximalen Ergebnisse/Serien nicht immer gleich und eine Spaltenübergreifende Sortierung geht ja auch nicht.

Lachtaube

Eine Kreuztabellenabfrage steht mit Unterabfragen für skalare Feldwerte auf Kriegsfuß. >:( Deshalb muss das Ergebnis der Rangermittlung zwischengespeichert werden (am besten in einer lokalen temporären Datenbank, die bei jedem Start neu erstellt wird - das ist aber nicht Thema dieses Threads). Ich zeige das Prinzip mit einer Tabellenerstellungsabfrage.SELECT t.starter_id,
       t.veranstaltung_id,
       t.ergebnis,
       "Erg_" & (SELECT Count(*)
                   FROM t x
                  WHERE x.starter_id = t.starter_id
                    AND x.ergebnis >= t.ergebnis) AS rang
  INTO tmp
  FROM t;
Auf diesen Daten kann dann die Kreuztabellenabfrage erstellt werdenTRANSFORM First(tmp.ergebnis) AS ErsterWertvonergebnis
SELECT tmp.starter_id,
       First(tmp.veranstaltung_id) AS veranstaltung_id
  FROM tmp
GROUP BY tmp.starter_id
PIVOT tmp.rang;
, welche dann dieses Ergebnis liefert.|------------+------------------+-------+-------+-------|
| starter_id | veranstaltung_id | Erg_1 | Erg_2 | Erg_3 |
|------------+------------------+-------+-------+-------|
|          1 |                1 |    90 |    88 |       |
|          2 |                1 |    97 |    89 |    88 |
|------------+------------------+-------+-------+-------|
Grüße von der (⌒▽⌒)

Waldis

#2
Hallo Lachtaube, danke für deine Antwort.

Ich hab es heute Nacht kurz vor deiner Antwort hinbekommen. Allerdings wohl ein wenig umständlicher. Werd mir deinen Ansatz mal anucken, sieht auf jeden Fall sauberer aus und ich weiß nun, dass man tmp Tabellen erstellen kann^^.
Das Problem bei doppelten Ergebnissen scheint dort aber auch zu bestehen.

Hab meins wie folgt gelöst:

SELECT s1.starter_id, s1.summe, Count(*) AS Rangfolge, s1.serie_id
FROM tblSerien AS s2, tblSerien AS s1
WHERE (((s1.starter_id)=s2.starter_id) And ((s1.summe)<=s2.summe))
GROUP BY s1.starter_id, s1.summe, s1.serie_id
ORDER BY s1.starter_id, Count(*);

Das ist mehr oder weniger wie deins, jedoch mit der serien_id um doppelte Ergebnisse nicht zu gruppieren.

1. Abfrage mit doppelter Rangfolge bei gleichen Summen

starter_id| summe |    Rangfolge  |   serie_id
2   | 96 | 1 | 14 |
2   | 95 | 2 | 3 |
2   | 93 | 5 | 15 |
  | 93 | 5 | 10 |
  | 93 | 5 | 7 |
2   | 92 | 7 | 4 |
2   | 92 | 7 | 8 |
2   | 91 | 8 | 11 |
2   | 90 | 10 | 13 |
2   | 90 | 10 | 16 |
2   | 89 | 12 | 12 |
2   | 89 | 12 | 9 |


Danach eine 2. Anfrage, die die 1. Anfrage aufgreift:

SELECT s1.starter_id, s1.summe, s1.Rangfolge-Count(*)+1 AS [Serien-Nr], Count(*)-1 AS Zahl
FROM sqlStarterSerienRangfolge AS s1, sqlStarterSerienRangfolge AS s2
WHERE (((s1.starter_id)=s2.starter_id) And ((s1.Rangfolge)=s2.Rangfolge) And ((s1.serie_id)<=s2.serie_id))
GROUP BY s1.starter_id, s1.summe, s1.Rangfolge, s1.serie_id
ORDER BY s1.summe DESC;

Hier nimmt er die 1. Abfrage und fügt eine neue Count-Spalte hinzu. Diese enthält eine Zählung, wenn beim jeweiligen Starter ein gleiches Ergebnis vorliegt.

2. Abfrage (Zahl = x. Mal doppelt)

starter_id|   summe |   Serien-Nr   |     Zahl
2   | 96 | 1 | 0
2   | 95 | 2 | 0
2   | 93 | 5 | 0
  | 93 | 5 | 1
  | 93 | 5 | 2
2   | 92 | 7 | 0
2   | 92 | 7 | 1
2   | 91 | 8 | 0
2   | 90 | 10 | 0
2   | 90 | 10 | 1
2   | 89 | 12 | 0
2   | 89 | 12 | 1


Zahl ist hier die Zählung, wie oft die Summe bereits vorhanden ist.
Am Schluss geh ich in der Abfrage dann hin und ziehe die Zahl dann von der doppelten Serien-Nr ab und nach Serien-Nr sortieren.

2. Abfrage (nachdem Zahl von Serien-Nr abgezogen wurde)

starter_id| summe |   Serien-Nr   |     Zahl
2   | 96 | 1 | 0
2   | 95 | 2 | 0
2   | 93 | 5 | 0
  | 93 | 4 | 1
  | 93 | 3 | 2
2   | 92 | 7 | 0
2   | 92 | 6 | 1
2   | 91 | 8 | 0
2   | 90 | 9 | 0
2   | 90 | 10 | 1
2   | 89 | 11 | 0
2   | 89 | 12 | 1


Falls das verständlich ist.
Find es schon arg umständlich, aber es funktioniert bisher 1A. :D