sql >> Databáze >  >> RDS >> Mysql

jak počítat horizontální hodnoty v databázi?

Neexistuje žádná vestavěná syntaxe, která by vám umožnila odkazovat na sadu sloupců dynamicky, tj. bez jejich explicitního pojmenování. Pokud chcete dynamiku, budete muset zadat metadata, abyste získali požadované názvy sloupců, a poté dynamicky sestavit konečný dotaz.

Předtím však musíte mít představu, jak přesně by měl dynamický dotaz probíhat při provádění samotné úlohy. Nejprve tedy budete muset problém vyřešit na konečném sada sloupců.

Existuje více než jeden způsob, jak tento problém vyřešit. metoda navržená @bluefeet je pravděpodobně jedním z přehlednějších i méně účinných. Můžete zkusit alespoň dvě alternativy:

  1. Počítejte každý sloupec samostatně pomocí podmíněné agregace a sečtěte všechny výsledky do jednoho výrazu:

    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 trik je vysvětlen zde .)

  2. Odklopte DATA sloupce pomocí křížového spojení s virtuální tabulkou a poté aplikujte podmínku na neotočný sloupec:

    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
    ;
    

    (Svým způsobem je to podobné návrhu @bluefeet, jen to nezaměstnává žádné UNIONy.)



  1. MySQL MONTHNAME() z čísel

  2. Jak zkopírovat tabulku z jedné tabulky na vzdáleném serveru do tabulky na jiné vzdálené databázi mysql5.6 s PDO

  3. Aktualizujte data aktivity ze služby, když je pozastavena

  4. Neo4j - Vytvořte index pomocí Cypher