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:
-
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 .) -
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.)