Der er ingen indbygget syntaks, der vil tillade dig at henvise til et sæt kolonner dynamisk, dvs. uden eksplicit at navngive dem. Hvis du vil have dynamik, skal du forespørge om metadata for at få fat i de påkrævede kolonnenavne, og derefter bygge den endelige forespørgsel dynamisk.
Men inden da skal du stadig have en idé om, hvordan den dynamiske forespørgsel præcist skal gå til at udføre selve jobbet. Så du bliver først nødt til at løse problemet på en endelig kolonnesæt.
Der er mere end én måde at løse dette problem på. metoden foreslået af @bluefeet er nok en af de klarere såvel som mindre effektive. Du kan prøve mindst to alternativer:
-
Tæl hver kolonne separat ved hjælp af betinget aggregering, og læg alle resultater sammen i ét udtryk:
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
trick er forklaret her .) -
Frigør
DATA
kolonner ved hjælp af en krydsforbindelse til en virtuel tabel, og anvend derefter betingelsen på den ikke-pivoterede kolonne: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å en måde ligner dette @bluefeets forslag, det beskæftiger bare ikke nogen UNIONer.)