stuppi: Spalteninhalt unabhängig voneinander in einem query zählen.

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.

  1. SELECT SUM(SpalteA > 0), SUM(SpalteB > 0)
    ...

    1. 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

      1. 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.

        1. 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

          1. 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)

            1. 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

              1. 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

                1. 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

                  1. 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.

                    1. 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

      2. 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