sql >> Database >  >> RDS >> Mysql

hoe tel je horizontale waarden in een database?

Er is geen ingebouwde syntaxis waarmee u dynamisch naar een reeks kolommen kunt verwijzen, d.w.z. zonder ze expliciet te benoemen. Als u dynamiek wilt, moet u metagegevens opvragen om de vereiste kolomnamen te krijgen, en vervolgens de uiteindelijke query dynamisch opbouwen.

Maar daarvoor moet je nog een idee hebben hoe de dynamische query precies moet werken om de taak zelf uit te voeren. U moet het probleem dus eerst oplossen op een eindige kolommenset.

Er is meer dan één manier om dit probleem op te lossen. De methode voorgesteld door @bluefeet is waarschijnlijk een van de duidelijkere en minder efficiënte. U kunt ten minste twee alternatieven proberen:

  1. Tel elke kolom afzonderlijk met behulp van voorwaardelijke aggregatie en tel alle resultaten op in één uitdrukking:

    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
    ;
    

    (De OR NULL truc wordt uitgelegd hier .)

  2. Maak de draai van de DATA ongedaan kolommen met behulp van een kruisverbinding met een virtuele tabel en pas vervolgens de voorwaarde toe op de niet-gedraaide kolom:

    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 zekere zin is dit vergelijkbaar met de suggestie van @bluefeet, er zijn alleen geen vakbonden in dienst.)



  1. Dieper graven in Django-migraties

  2. Fix "ERROR 1222 (21000):de gebruikte SELECT-instructies hebben een ander aantal kolommen" bij gebruik van UNION in MariaDB

  3. Hoe een externe sleutel in SQL toe te voegen?

  4. Waarom worden transacties niet teruggedraaid bij gebruik van SpringJUnit4ClassRunner/MySQL/Spring/Hibernate