Mysql
 sql >> Base de données >  >> RDS >> Mysql

comment compter les valeurs horizontales sur une base de données ?

Il n'y a pas de syntaxe intégrée qui vous permettrait de faire référence à un ensemble de colonnes de manière dynamique, c'est-à-dire sans les nommer explicitement. Si vous voulez de la dynamique, vous devrez interroger les métadonnées pour saisir les noms de colonne requis, puis créer la requête finale de manière dynamique.

Mais avant cela, vous devez toujours avoir une idée de la manière dont la requête dynamique doit procéder pour effectuer le travail lui-même. Donc, vous devrez d'abord résoudre le problème sur un fini jeu de colonnes.

Il y a plus d'une façon de résoudre ce problème. La méthode suggérée par @bluefeet est probablement l'un des plus clairs et des moins efficaces. Vous pouvez essayer au moins deux alternatives :

  1. Comptez chaque colonne séparément à l'aide de l'agrégation conditionnelle et additionnez tous les résultats dans une seule expression :

    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
    ;
    

    (Le OR NULL l'astuce est expliquée ici .)

  2. Dépivoter les DATA colonnes à l'aide d'une jointure croisée à une table virtuelle, puis appliquez la condition à la colonne non pivotée :

    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
    ;
    

    (D'une certaine manière, cela ressemble à la suggestion de @bluefeet, cela n'emploie tout simplement aucun UNION.)