sql >> データベース >  >> RDS >> Mysql

データベースの水平値をカウントする方法は?

    列のセットを動的に、つまり明示的に名前を付けずに参照できるようにする組み込みの構文はありません。動的性が必要な場合は、メタデータをクエリして必要な列名を取得してから、最終的なクエリを動的に作成する必要があります。

    ただし、その前に、動的クエリがジョブ自体を実行するためにどの程度正確に実行する必要があるかを理解する必要があります。したがって、最初に有限で問題を解決する必要があります。 列セット。

    この問題を解決する方法は複数あります。 @bluefeetが提案する方法 おそらく、より明確で効率の悪いものの1つです。少なくとも2つの選択肢を試すことができます:

    1. 条件付き集計を使用してすべての列を個別にカウントし、すべての結果を1つの式に合計します。

      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
      ;
      

      OR NULL トリックの説明ここ 。)

    2. DATAのピボットを解除します 仮想テーブルへのクロス結合を使用して列を作成し、ピボットされていない列に条件を適用します。

      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
      ;
      

      (ある意味、これは@bluefeetの提案に似ており、UNIONを使用していません。)



    1. mysqlの特定の日付形式

    2. PHPでmysql列挙値を表示する

    3. プリペアドステートメントでテーブル名をパラメータ化できますか?

    4. 複数のフィールドによるMySQLの一意のインデックス