Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie zählt man horizontale Werte in einer Datenbank?

Es gibt keine integrierte Syntax, mit der Sie dynamisch auf eine Reihe von Spalten verweisen könnten, d. H. Ohne sie explizit zu benennen. Wenn Sie Dynamik wünschen, müssen Sie Metadaten abfragen, um die erforderlichen Spaltennamen zu erhalten, und dann die endgültige Abfrage dynamisch erstellen.

Aber vorher müssten Sie noch eine Vorstellung davon haben, wie genau die dynamische Abfrage den Job selbst ausführen soll. Sie müssen also zuerst das Problem endlich lösen Spaltensatz.

Es gibt mehr als eine Möglichkeit, dieses Problem zu lösen. Die Methode, die von @bluefeet vorgeschlagen wird ist wahrscheinlich einer der klareren sowie weniger effizienten. Sie könnten mindestens zwei Alternativen ausprobieren:

  1. Zählen Sie jede Spalte separat mit bedingter Aggregation und addieren Sie alle Ergebnisse in einem Ausdruck:

    SELECT
      COUNT(DATA1 > 0 OR NULL) +
      COUNT(DATA2 > 0 OR NULL) +
      COUNT(DATA3 > 0 OR NULL) +
      COUNT(DATA4 > 0 OR NULL) +
      COUNT(DATA5 > 0 OR NULL) +
      COUNT(DATA6 > 0 OR NULL) +
      COUNT(DATA7 > 0 OR NULL) AS TOTAL
    FROM yourtable
    ;
    

    (Der OR NULL Trick wird erklärt hier .)

  2. Entpivotieren Sie die DATA Spalten, die einen Cross Join mit einer virtuellen Tabelle verwenden, und wenden Sie dann die Bedingung auf die nichtpivotierte Spalte an:

    SELECT
      COUNT(*) AS TOTAL
    FROM (
      SELECT
        CASE s.col
          WHEN 'DATA1' THEN DATA1
          WHEN 'DATA2' THEN DATA2
          WHEN 'DATA3' THEN DATA3
          WHEN 'DATA4' THEN DATA4
          WHEN 'DATA5' THEN DATA5
          WHEN 'DATA6' THEN DATA6
          WHEN 'DATA7' THEN DATA7
        END AS DATA
      FROM yourtable
      CROSS JOIN (
        SELECT 'DATA1' AS col
        UNION ALL SELECT 'DATA2'
        UNION ALL SELECT 'DATA3'
        UNION ALL SELECT 'DATA4'
        UNION ALL SELECT 'DATA5'
        UNION ALL SELECT 'DATA6'
        UNION ALL SELECT 'DATA7'
      ) s
    ) s
    WHERE DATA > 0
    ;
    

    (In gewisser Weise ähnelt dies dem Vorschlag von @bluefeet, es verwendet nur keine UNIONs.)