Mysql
 sql >> Database >  >> RDS >> Mysql

come contare i valori orizzontali su un database?

Non esiste una sintassi incorporata che ti consenta di fare riferimento a un insieme di colonne in modo dinamico, ovvero senza denominarle esplicitamente. Se desideri la dinamicità, dovrai eseguire query sui metadati per acquisire i nomi di colonna richiesti, quindi creare la query finale in modo dinamico.

Ma prima avresti ancora bisogno di avere un'idea di come esattamente dovrebbe funzionare la query dinamica per eseguire il lavoro stesso. Quindi, dovrai prima risolvere il problema su un finito set di colonne.

C'è più di un modo per risolvere questo problema. Il metodo suggerito da @bluefeet è probabilmente uno dei più chiari e anche meno efficienti. Potresti provare almeno due alternative:

  1. Conta ogni colonna separatamente usando l'aggregazione condizionale e somma tutti i risultati in un'unica espressione:

    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
    ;
    

    (Il OR NULL il trucco è spiegato qui .)

  2. Annulla il pivot del DATA colonne utilizzando un cross join a una tabella virtuale, quindi applica la condizione alla colonna non pivot:

    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 un certo senso, questo è simile al suggerimento di @bluefeet, semplicemente non impiega alcun UNION.)