AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung iOS SQLite - Select mit mehreren Tabellen

SQLite - Select mit mehreren Tabellen

Ein Thema von Crocotronic · begonnen am 15. Mär 2014 · letzter Beitrag vom 17. Mär 2014
Antwort Antwort
Seite 2 von 2     12
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#11

AW: SQLite - Select mit mehreren Tabellen

  Alt 16. Mär 2014, 16:58
Irgendwie kommt es mir so vor, als wären Subqueries gar nicht möglich
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#12

AW: SQLite - Select mit mehreren Tabellen

  Alt 17. Mär 2014, 06:59
In meinem Fall muss ich etwas gruppieren und dann den Mittelwert aller Gruppen berechnen:
Code:
SELECT AVG(tmp) FROM (...(SUM(...)/COUNT(*))... AS tmp);
Jedes Subselect benötigt einen Alias, also:
Code:
 SELECT .... from (select ... from ...) alias X
Dessenungeachtet ist das Mittelwertbilden von Mittelwerten eine Milchmädchenrechnung:
Auf der Insel Delfipractico befinden sich die Dörfer Villa-Vcl und Villa-Fmx.
Die 1000 Bewohner von Villa-Vcl verdienen im Durchschnitt 1 Euro (arme Bauern halt).
Die beiden Bewohner von Villa-Fmx verdienen beide jeweils 1000 Euro (sie vermarkten die bäuerlichen Erzeugnisse).
Der Durchschnittslohn auf der Insel Delfipractico beträgt also...
a: (1000 + 1) / 2 = 500,50 Euro?
b: (1000 x 1 + 2 x 1000) / 1002 = 2,99 Euro?
c: 1 Euro? (Median)

Ganz sicher nicht (a). Je nach konkreter Fragestellung eher (b) oder (c).

Das ändert natürlich nichts an der Problematik von Subselects, aber dein Beispiel verwirrt mich, und deshalb mein Einwand.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.429 Beiträge
 
Delphi 2010 Enterprise
 
#13

AW: SQLite - Select mit mehreren Tabellen

  Alt 17. Mär 2014, 07:19
Irgendwie kommt es mir so vor, als wären Subqueries gar nicht möglich
Mir kommt es so vor, als ob das ein sehr schwacher (Denk-)Ansatz ist.

Wer oder was hindert Dich eine einfache Subquery Abfrage zu testen?
Es ist doch offensichtlich so, dass iOS Doku zum Thema sqlite nicht sehr verfügbar ist. (was ich sehr seltsam finde- gibt es wenigstens sowas wie eine bekannte sqLite Version unter iOS?)
Außerdem gibt es scheinbar nicht viele Leute, die ein entsprechendes System am Start haben und solche Fragen nachvollziehen können.
Wie soll auf dieser Grundlage ein unvollständig angegebenes SQL Statement funktionsfähig gemacht werden?
Kannst Du aktuell sagen, welcher Teil des Statements überhaupt den Fehler verursacht?
Gruß, Jo
  Mit Zitat antworten Zitat
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#14

AW: SQLite - Select mit mehreren Tabellen

  Alt 17. Mär 2014, 13:20
Okay, pass auf:
Es soll eine Notenverwaltung + Rechner erstellt werden. Ich habe 3 Tabelle: Noten, Gewichtungen und Schulfächer. Die Tabelle Noten besteht aus den Fremdschlüsseln Subject , Weight und dem Attribut Grade(Float). Jetzt soll der Notenstand aller Fächer berechnet werde, also z.B.:
Code:
(Note1*Gewichtung1)+(Note4*Gewichtung1)+(Note6*Gewichtung1)/(Anzahl Noten Pro Gewichtung)+
(Note2*Gewichtung2)+(Note3*Gewichtung2)/(Anzahl Noten Pro Gewichtung)+...
Dazu folgende Abfrage:
SQL-Code:
SELECT SUM(tmp) FROM (
                      SELECT weights.weight, subjects.name, SUM(grades.grade*weights.weight)/COUNT(*))/100 AS tmp
                      FROM grades
                            JOIN subjects ON grades.subject = subjects.recno
                            JOIN weights ON grades.weight = weights.recno
                      GROUP BY weights.weight, subjects.name'
) AS x;
Die Exception tritt auf, sobal ich das aüßer Select hinzufüge.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

AW: SQLite - Select mit mehreren Tabellen

  Alt 17. Mär 2014, 13:25
SQL-Code:
SELECT SUM(tmp) FROM (
                      SELECT weights.weight, subjects.name, SUM(grades.grade*weights.weight)/COUNT(*))/100 AS tmp
                      FROM grades
                            JOIN subjects ON grades.subject = subjects.recno
                            JOIN weights ON grades.weight = weights.recno
                      GROUP BY weights.weight, subjects.name'
) AS x;
Ist das jetzt der unveränderte Original-Code?

Dann ist das ' schonmal falsch.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.203 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#16

AW: SQLite - Select mit mehreren Tabellen

  Alt 17. Mär 2014, 13:34
Zudem sind alle Verbesserungen dieses Threads nicht umgesetzt!

Ich würde auch konsequent Aliase verwenden. Die Joinbedingungen sind auch vertauscht.

SQL-Code:
SELECT
  1 as Feld,
  SUM(x.tmp) as tmp
FROM
  (
      SELECT
          w.weight, s.name, SUM(g.grade*w.weight)/COUNT(*))/100 AS tmp
      FROM
          grades g
              JOIN subjects s ON s.recno = g.subject
              JOIN weights ON w.recno = g.weight
      GROUP BY
          w.weight, s.name
) x
GROUP BY
  x.Feld;
Markus Kinzler
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#17

AW: SQLite - Select mit mehreren Tabellen

  Alt 17. Mär 2014, 13:40
Hmmm. Scheint so, als ob SQLite wirklich 'SQL light' ist.

Übrigens: Der gewichtete Mittelwert berechnet sich aber eher so:
(Note1*g1 + Note2*g2...NoteN*gN)/(g1+g2+...gN)

Beispiel:
Noten (1,2,3) Gewichte (100,5,1) = (100*1 + 2*5 + 3*1) / (100+5+1) = 113/106 = 1,1
Bei deiner Formel käme aber 113/3 = 39 heraus.

Ich denke, man könnte so zum Ziel kommen

Code:
SELECT SUM(grades.grade*weights.weight)/sum(weights.weight) AS averageGrade
  FROM grades
       JOIN subjects ON grades.subject = subjects.recno
       JOIN weights ON grades.weight = weights.recno
  Mit Zitat antworten Zitat
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#18

AW: SQLite - Select mit mehreren Tabellen

  Alt 17. Mär 2014, 14:19
SQL-Code:
SELECT
  1 as Feld,
  SUM(x.tmp) as tmp
FROM
  (
      SELECT
          w.weight, s.name, SUM(g.grade*w.weight)/COUNT(*))/100 AS tmp
      FROM
          grades g
              JOIN subjects s ON s.recno = g.subject
              JOIN weights ON w.recno = g.weight
      GROUP BY
          w.weight, s.name
) x
GROUP BY
  x.Feld;
Und immer noch wird die Exception "Operation wird nicht unterstüzt" ausgelöst. Aber dann glaube ich ihm halt mal, dass die Operation nicht unterstüzt wird... SQLite ist eben
wirklich 'SQL light' [zumindest unter iOS]
Ohne Subselect funktionierts.
Das ist jetzt aber nicht weiter schlimm, muss halt alles weitere in Delphi ausführen, kosten auch nicht soo viel mehr Zeit.

Und danke Furtbichler, dass du mein Beispiel verbessert hast. Damit hast du ein weites Problem gelöst
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.429 Beiträge
 
Delphi 2010 Enterprise
 
#19

AW: SQLite - Select mit mehreren Tabellen

  Alt 17. Mär 2014, 16:17
SQL-Code:
SELECT
  1 as Feld,
  SUM(x.tmp) as tmp
FROM
  (
      SELECT
          w.weight, s.name, SUM(g.grade*w.weight)/COUNT(*))/100 AS tmp
      FROM
          grades g
              JOIN subjects s ON s.recno = g.subject
              JOIN weights ON w.recno = g.weight
      GROUP BY
          w.weight, s.name
) x
GROUP BY
  x.Feld;
Und immer noch wird die Exception "Operation wird nicht unterstüzt" ausgelöst. Aber dann glaube ich ihm halt mal, dass die Operation nicht unterstüzt wird... SQLite ist eben
wirklich 'SQL light' [zumindest unter iOS]
Ohne Subselect funktionierts.
Das ist jetzt aber nicht weiter schlimm, muss halt alles weitere in Delphi ausführen, kosten auch nicht soo viel mehr Zeit.
Das Group By wird so auch nicht unbedingt unterstüzt. Ich weiß nicht, ob das in jedem System so ist, aber der vergebene Alias "Feld" ist dem Group by nicht unbedingt bekannt, da er nicht aus der FROM Quelle kommt, sondern erst danach im Select Statement erzeugt wird.
An dieser Stelle kann man im Group By statt der Feldnamen höchstens mit den Feldnummern des Select Statements arbeiten. Hier zufällig die "1" als Konstante, entsprechend Feldnummer 1.

Das ist zumindest nich nur bei "light" Systemen so.

Group by sähe also eher so aus:
Code:
group by 1;
Gruß, Jo
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf