Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

como contar valores horizontais em um banco de dados?


Não há sintaxe interna que permita que você faça referência a um conjunto de colunas dinamicamente, ou seja, sem nomeá-las explicitamente. Se você quiser dinamicidade, precisará consultar metadados para obter os nomes de coluna necessários e, em seguida, criar a consulta final dinamicamente.

Mas antes disso você ainda precisa ter uma ideia de como exatamente a consulta dinâmica deve executar o trabalho em si. Então, primeiro você precisa resolver o problema em um finito conjunto de colunas.

Há mais de uma maneira de resolver esse problema. O método sugerido por @bluefeet é provavelmente um dos mais claros e menos eficientes. Você pode tentar pelo menos duas alternativas:

  1. Conte cada coluna separadamente usando agregação condicional e some todos os resultados em uma expressão:
    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
    ;
    

    (O OR NULL o truque é explicado aqui .)

  2. Desarticular os DATA colunas usando uma junção cruzada para uma tabela virtual e, em seguida, aplique a condição à coluna não dinâmica:
    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
    ;
    

    (De certa forma, isso é semelhante à sugestão do @bluefeet, apenas não emprega nenhum UNION.)