| Autor |
Beitrag |
pesi
      
Beiträge: 67
Erhaltene Danke: 1
|
Verfasst: Mi 23.02.11 10:40
Hallo,
ich würde mich mal eher als Anfänger im Bereich SQL sehen (der Standard klappt so einigermaßen) und nun bin ich auf der Suche nach einer Lösung für ein komplexeres (???) Problem:
Nehmen wir mal einfach mal eine Tabelle mit folgenden Feldern:
ID (unique)
WERT (Integer)
Das normale Zählen mache ich dann so " Select Count(ID) from Tabelle "
oder auch mal für bestimmte Werte " Select Count(ID) from Tabelle where ID>'40' "
Soweit so einfach... jetzt würde ich aber gerne zählen bei wievielen Datensätzen WERT>40 ist und bei wievielen WERT<40 ist. Also mal ins unreine geschrieben ein "Count(where ID>'40')" und ein Count(where ID<'40') (JA, is natürlich von der Syntax her kompletter Humbug, sollte nur der näeheren Erklärung dienen!).
Bekomme ich sowas in einem Select Statement aber überhaupt hin???
Danke & Gruß
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 23.02.11 10:48
Auf die Schnelle würde ich es mit diesem Ansatz versuchen:
SQL-Anweisung 1: 2: 3:
| Select count(id), sign(wert-40) from Tabelle group by sign(wert-40) |
|
|
pesi 
      
Beiträge: 67
Erhaltene Danke: 1
|
Verfasst: Mi 23.02.11 14:47
Hi Jasoucul,
ist auf jeden Fall schon mal eine sehr interessante Idee! Werde ich an anderer Stelle bestimmt nochmal gut brauchen können! Danke dafür!
Im Bezug auf mein Problem bringt mich das allerdings erst mal nicht weiter, da ich beide Ergebnisse ja gerne in einer Ausgabezeile hätte, so habe ich sie in unterschiedlichen Zeilen.
Ziel des ganzen ist eigentlich, und das hätte ich vielleicht erwähnen sollen, ein Verhältnis der Werte<40 zu den Werten>40 zu erhalten. (also quasi "Werte<40" / "Werte>40")
DAS bekomme ich aber mit Deinem Ansatz erst mal nicht hin
Gruß Peter
--- Moderiert von Narses: Beiträge zusammengefasst---
...oder doch????
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 23.02.11 15:05
Man kann auch
SQL-Anweisung 1: 2: 3: 4: 5:
| SELECT SUM(IF(Wert<40,1,0)) AS Foo, SUM(IF(Wert>40,1,0)) AS Bar, COUNT(id) AS Baz FROM Tabelle |
machen. Aus Baz - Bar - Foo bekommt man dann, wieviele genau 40 sind. UND es steht auf einer Zeile 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 23.02.11 15:09
Moin!
@ BenBE: nette Idee, ich hätte das so gemacht:
SQL-Anweisung 1:
| SELECT COUNT(*) AS cnt, (wert > 40) AS is40 FROM table GROUP BY is40 |
pesi hat folgendes geschrieben : | Im Bezug auf mein Problem bringt mich das allerdings erst mal nicht weiter, da ich beide Ergebnisse ja gerne in einer Ausgabezeile hätte, so habe ich sie in unterschiedlichen Zeilen.
Ziel des ganzen ist eigentlich, und das hätte ich vielleicht erwähnen sollen, ein Verhältnis der Werte<40 zu den Werten>40 zu erhalten. (also quasi "Werte<40" / "Werte>40") |
Das wirst du AFAIK auch mit einem Statement nicht hinkriegen.  Hier müsste man ja nochmal nach der Aggregatfunktion rechnen...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 23.02.11 15:20
Narses hat folgendes geschrieben : | Moin!
@ BenBE: nette Idee, ich hätte das so gemacht:
SQL-Anweisung 1:
| SELECT COUNT(*) AS cnt, (wert > 40) AS is40 FROM table GROUP BY is40 |
pesi hat folgendes geschrieben : | Im Bezug auf mein Problem bringt mich das allerdings erst mal nicht weiter, da ich beide Ergebnisse ja gerne in einer Ausgabezeile hätte, so habe ich sie in unterschiedlichen Zeilen.
Ziel des ganzen ist eigentlich, und das hätte ich vielleicht erwähnen sollen, ein Verhältnis der Werte<40 zu den Werten>40 zu erhalten. (also quasi "Werte<40" / "Werte>40") | Das wirst du AFAIK auch mit einem Statement nicht hinkriegen. Hier müsste man ja nochmal nach der Aggregatfunktion rechnen...
cu
Narses |
Wie jetzt, geht nicht in einem Statement?
SQL-Anweisung 1: 2: 3: 4: 5: 6:
| @r := SELECT SUM(IF(Wert<40,1,0)) AS Foo, SUM(IF(Wert>40,1,0)) AS Bar, COUNT(id) AS Baz FROM Tabelle; SELECT Foo, Bar, Baz, Foo/Bar AS Quo FROM @r |
ODER auch direkt:
SQL-Anweisung 1: 2: 3: 4: 5:
| SELECT Foo, Bar, Baz, Foo/Bar AS Quo FROM (SELECT SUM(IF(Wert<40,1,0)) AS Foo, SUM(IF(Wert>40,1,0)) AS Bar, COUNT(id) AS Baz FROM Tabelle) |
(Beides ungetestet, aber sollte passen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 23.02.11 15:38
|
|
pesi 
      
Beiträge: 67
Erhaltene Danke: 1
|
Verfasst: Mi 23.02.11 15:53
Hui... ich komme ja kaum mit dem Testen der Vorschläge nach, geschweige denn komme ich zum Antworten
BenBE: Also, dieses SUM(IF(.....)) Gedöns war mit unbekannt und ist für mich [quote]eine echt super Information UND natürlich hilft sie mir auch exakt bei meinem Problem. Da kann ich am Einfachsten mit arbeiten und weiter gruppieren und rechnen und all sowas! SUPER - DANKE!
Jasocul: Deine Lösung funktioniert prinzipiell auch unter MySQL (fehlt nur noch ein AS...), ist auf jeden Fall auch eine tolle Sache die ich noch nicht kannte, ist mir aber eher zu kompliziert wenn ich noch weitere Where-Clauses einfügen will (die müsste ich ja dann mehrfach einfügen (nehme ich mal an). Egal, trotzdem WIEDER WAS GELERNT - DANKE!
Vielen Dank Euch Allen - Hätte gar nicht gedacht, dass ich soooo schnell eine Lösung bekomme! Großartig!
GrußPeter
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 23.02.11 16:07
Moin!
BenBE hat folgendes geschrieben : | | Wie jetzt, geht nicht in einem Statement? |
Geht nicht in einem SELECT-Statement, wäre korrekt gewesen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 23.02.11 16:20
@pesi:
Oracle ist da nicht so empfindlich, was das "as" betrifft. 
|
|
|