komplexe where statements?

Hallo zusammen,

bin noch recht neu was SQL angeht und habe ein einfaches Problem:

select
A.ID
sum(B.zähler* 100) / sum(B.nenner) as bruch,
from
table1 A
join table2 B on A.ID = B.ID
where
bruch > 0
group by
A.ID

Das funktioniert nicht, weil es keine Spalte bruch gibt, aber Aggregate darf ich da ja auch nicht benutzen. Weiß jemand, wie ich das bekomme, was ich will? :slight_smile:

“bruch” ist nur der Name der Ergebnisspalte.
Du könntest jedoch die gleiche Operation noch einmal in die WHERE-Bedingung schreiben.

Das dachte ich mir auch, allerdings erzählt er mir dann “no aggregates in where clauses allowed”

Du hast irgendwie ein grundlegenderes Verständnisproblem, denke ich. Die Aggregatfunktion darfst du darum nicht verwenden weil Aggregatfunktionen sowieso nur genau ein Ergebnis zurück liefern. Demzufolge gibt es nichts, was du mittels WHERE einschränken müsstest.

Wenn du das mit einer anderen Menge joinen willst, solltest du über Subselects nachdenken. Allerdings ist mir auch nicht ganz klar, was du konkret erreichen willst.

okay, zum Beispiel gibt mir B.nenner prozentual an, wie oft ich von allen Würfelversuchen meiner DB eine Augenzahl kleiner als 3 geworfen hab.
B.zähler gibt mir dann an, wie oft mein Ergebnis mit einem zweiten Wurf kleiner als 6 war (auch prozentual).

Und jetzt möchte ich in meiner Ergebnistabelle nach diesem Wert (zähler/nenner) filtern können und nur die A.IDs aufführen, die dem Filter entsprechen. Man müsste dann irgendwie sowas angeben können wie bruch > 0,5 oder was auch immer.

Nun, du könntest deine Aggregatfunktionen in Subselects auslagern … vielleicht bringt dich das weiter.

test=# \d test;
                        Tabelle »public.test«                                                                                                  
 Spalte |   Typ   |                     Attribute                                                                                              
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('test_id_seq'::regclass)
 z1     | integer |
 z2     | integer |
Indexe:
    »test_pkey« PRIMARY KEY, btree (id)

test=# select * from test;
 id | z1 | z2
----+----+----
  1 | 12 | 14
  2 | 13 | 64
  3 | 12 | 12
(3 Zeilen)

test=# select
id, sum(z1 * 100) / sum(z2) as bruch
from test
group by id;
 id | bruch
----+-------
  1 |    85
  3 |   100
  2 |    20
(3 Zeilen)

test=# select
id, sum(z1 * 100) / sum(z2) as bruch
from test
group by id
having (sum(z1 * 100) / sum(z2)) > 50;
 id | bruch
----+-------
  1 |    85
  3 |   100
(2 Zeilen)

Hilft dir das weiter?

genial, genau das hab ich gebraucht :wink:

Danke

Nochmal eine andere Sache:

Ich hab eine Tabelle die meinetwegen so aussieht:

A
A
A
B
B
C
C
C

und ich will jetzt sowas bekommen:

A 3
B 2
C 3

Dass da irgendwie count ins Spiel kommen muss, ist ja klar, nur das zählt doch die Spalten der kompletten Tabelle, wie kann ich da Spalten mit gleichen Werten gruppieren und zählen?

sx=> SELECT * FROM grouptest;
 t
---
 A
 A
 A
 B
 B
 C
 C
 C
(8 Zeilen)

sx=> SELECT t, count(*) FROM grouptest GROUP BY t ORDER BY t;
 t | count
---+-------
 A |     3
 B |     2
 C |     3
(3 Zeilen)

Du solltest dich intensiver mit SQL auseinander setzen. :wink:

http://sql.1keydata.com/de/sql-group-by.php

Gruß
Sparrow

Also irgendwie funktioniert das in meiner Abfrage nicht. Wenn ich folgende Abfrage ohne das count ausführe, bekomme ich schön alle Werte in einer Spalte ausgegeben und wenn ich das count dazunehme, hab ich pro Wert auch nur eine Spalte mit einer Anzahl dahinter, die aber nicht stimmt.

Z.B. hab ich ohne das count in meiner Ausgabe genau 3x die Spalte mit Wert “A” drin, krieg aber mit count 81x angezeigt o0

select
        C.hole_cards,
        count(C.hole_cards)
from
        holdem_hand_player_detail D
        join holdem_hand_player_statistics S on D.id_hand = S.id_hand and D.id_player = S.id_player
        join lookup_hole_cards C on C.id_holecard = S.id_holecard
        join holdem_limit L on S.id_limit = L.id_limit
        join holdem_cache CC on CC.id_player = D.id_player
where
        S.flg_p_squeeze AND
        L.id_limit = 6 OR L.id_limit = 8 AND
        D.id_player != 1423
group by
        C.hole_cards    
having        sum(CC.cnt_vpip * 100) / sum(CC.cnt_hands) > 15 AND
        sum(CC.cnt_pfr * 100) / sum(CC.cnt_hands) > 10 AND
        sum(CC.cnt_vpip * 100) / sum(CC.cnt_hands) - sum(CC.cnt_pfr * 100) / sum(CC.cnt_hands) <= 10 AND
        sum(CC.cnt_hands) > 50
order by    C.hole_cards

Zeig mal bitte die genaue Ausgabe deiner beiden Abfragen.
Am besten in psql ausgeführt.

Naja da ist jetzt nix besonderes und das dauert auch ziemlich lange, da die DB recht groß ist, aber zusammengefasst hab ich in der Version ohne count einfach jede Starthand aufgelistet, was dann so aussieht:

AA
.
.
.
AA
AK
.
.
.
AK
AQ
.
.
.
AQ
AJ
.
.
.

und wenn ich es mit count mache, sieht es so aus

AA 123
AK 456
AQ 789

usw. Allerdings kann ich ja die Anzahl der Zeilen mit AA aus Tabelle 1 zählen und mit der Zahl in Tabelle 2 vergleichen und die stimmt nie. Genau genommen ist sie immer viel zu groß.

Ich führe die Abfragen die Tage nochmal aus und reiche sie dann nach.