sql >> Databasteknik >  >> RDS >> Mysql

hur man räknar horisontella värden i en databas?

Det finns ingen inbyggd syntax som gör att du kan referera till en uppsättning kolumner dynamiskt, d.v.s. utan att uttryckligen namnge dem. Om du vill ha dynamik måste du fråga metadata för att få tag på de obligatoriska kolumnnamnen och sedan bygga den slutliga frågan dynamiskt.

Men innan dess måste du fortfarande ha en idé om hur exakt den dynamiska frågan ska gå till för att utföra själva jobbet. Så du måste först lösa problemet ändligt kolumnuppsättning.

Det finns mer än ett sätt att lösa detta problem. metoden som föreslagits av @bluefeet är förmodligen en av de tydligare och mindre effektiva. Du kan prova minst två alternativ:

  1. Räkna varje kolumn separat med villkorlig aggregering och lägg ihop alla resultat i ett uttryck:

    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 knep förklaras här .)

  2. Lossa DATA kolumner med hjälp av en korskoppling till en virtuell tabell, tillämpa sedan villkoret på den opivoterade kolumnen:

    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
    ;
    

    (På sätt och vis liknar detta @bluefeets förslag, det använder bara inga UNION.)



  1. com.zaxxer.hikari.pool.PoolInitializationException:Undantag under poolinitiering

  2. Returnera NULL om Count(*) är noll

  3. Får ibland SqlException:Timeout har gått ut

  4. Förstå PDO-förberedda uttalanden och bindande parametrar