Spalteninhalt unabhängig voneinander in einem query zählen.
stuppi
- datenbank
Ich möchte bei einer Tabelle (MySQL) die Werte die ungleich 0 sind in zwei Spalten mit einem Query unabhängig voneinander zählen.
Tabelle:
Spalte A Spalte B
2 0
1 1
0 4
5 0
Im Ergebniss müsste dann also rauskommen für Spalte A: 3, und für Spalte B 2.
SELECT SUM(SpalteA > 0), SUM(SpalteB > 0)
...
yo,
SELECT SUM(SpalteA > 0), SUM(SpalteB > 0)
SUM schon mal gar nicht, sondern COUNT und diese art der bedingung kannst du dort auch nicht verwenden. besser ist dort NULLIF.
SELECT COUNT(NULLIF(spalteA, 0)) AnzahlA, COUNT(NULLIF(spalteB, 0)) AnzahlB
FROM tabelle
;
Ilja
SUM schon mal gar nicht, sondern COUNT
beides führt zum Ziel
und diese art der bedingung kannst du dort auch nicht verwenden.
da glaube ich dem MySQL-Handbuch lieber mehr als dir.
yo,
»» SUM schon mal gar nicht, sondern COUNT
beides führt zum Ziel
mit sicherheit kommen mit SUM oder COUNT andere ergebnisse raus, sind also zwei verschiedene dinge.
»» und diese art der bedingung kannst du dort auch nicht verwenden.
da glaube ich dem MySQL-Handbuch lieber mehr als dir.
wäre eine eigenheit von mysql, wo in der Doku steht das den ?
Ilja
mit sicherheit kommen mit SUM oder COUNT andere ergebnisse raus, sind also zwei verschiedene dinge.
Nein, es kommt bei beiden SELECTs exakt das gleich Ergebnis
wäre eine eigenheit von mysql, wo in der Doku steht das den ?
bei den Operators, MySQL liefert nicht true/false sondern 0/1
2 > 2 = 0
3 > 2 = 1
Somit vergleichbar mit einem CASE WHEN Konstrukt
SUM(CASE WHEN Spalte > 0 THEN 1 ELSE 0 END)
yo,
bei den Operators, MySQL liefert nicht true/false sondern 0/1
das wäre eine mysql spezifische lösung und zu vermeiden, weil es einem keinen vorteil bringt und man sich die portierbarkeit verbaut.
2 > 2 = 0
3 > 2 = 1
Somit vergleichbar mit einem CASE WHEN Konstrukt
SUM(CASE WHEN Spalte > 0 THEN 1 ELSE 0 END)
auch darauf würde ich verzichten, das ist ein verkapter COUNT. und wenn ich etwas zählen will, sollet man nicht SUM dafür missbrauchen. was mich aber immer noch wundert, dass mysql solch ein konstrukt SUM (wert > 0) syntaktisch mitmacht. wo ist der Link dazu ?
Ilja
was mich aber immer noch wundert, dass mysql solch ein konstrukt SUM (wert > 0) syntaktisch mitmacht. wo ist der Link dazu ?
Das liegt an der Tatsache, das MySQL kein boolean kennt und dafür tinyint nutzt, somit ergibt jede boolsche Abfrage ein Ergebnis von tinyint.
Bei SUM() kann als expr jeder beliebige Ausdruck verwendet werden, welcher ein numerisches Ergebnis liefert.
http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#operator_greater-than
yo,
Das liegt an der Tatsache, das MySQL kein boolean kennt und dafür tinyint nutzt, somit ergibt jede boolsche Abfrage ein Ergebnis von tinyint.
einige dbms kennen keinen boolean, aber deswegen kann man nicht gleich automatisch SUM (a > b) verwenden.
Bei SUM() kann als expr jeder beliebige Ausdruck verwendet werden, welcher ein numerisches Ergebnis liefert.
ich habe hier leider nur mssql und oracle, kann es also nicht nachvollziehen. reden wir davon, dass du solch eine konstrukt bereits benutzt hast oder von der theorie, dass es eventuell gehen sollte ?
Ilja
ich habe hier leider nur mssql und oracle, kann es also nicht nachvollziehen. reden wir davon, dass du solch eine konstrukt bereits benutzt hast oder von der theorie, dass es eventuell gehen sollte ?
Solche Konstrukte nutze ich bereits seit der 3er Version.
yo,
Solche Konstrukte nutze ich bereits seit der 3er Version.
kann ich wie gesagt nur von abraten, andere dbms kommen damit nicht klar, bzw. schmeissen fehlermeldungen und warum ich SUM() dafür missbrauchen sollte zu zählen ist mir fern jeder logik und lesbarkeit.
Ilja
komischerweise funktioniert es mit SUM, danke für die Lösung
yo,
»» SELECT SUM(SpalteA > 0), SUM(SpalteB > 0)
SUM schon mal gar nicht, sondern COUNT und diese art der bedingung kannst du dort auch nicht verwenden. besser ist dort NULLIF.
SELECT COUNT(NULLIF(spalteA, 0)) AnzahlA, COUNT(NULLIF(spalteB, 0)) AnzahlB
FROM tabelle
;Ilja