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