Если вы используете Sql Server 2005, вы можете использовать UNPIVOT
DECLARE @Table TABLE(
var1 VARCHAR(10),
var2 VARCHAR(10),
var3 VARCHAR(10),
cats VARCHAR(10)
)
INSERT INTO @Table SELECT 'a','b','b','cat1'
INSERT INTO @Table SELECT null,'b','b','cat1'
INSERT INTO @Table SELECT 'a',null,null,'cat2'
INSERT INTO @Table SELECT 'a','a','a','cat3'
INSERT INTO @Table SELECT 'a','a','a','cat2'
SELECT MyVars,
cats,
SUM(CASE WHEN Vars = 'a' THEN 1 ELSE 0 END) A,
SUM(CASE WHEN Vars = 'b' THEN 1 ELSE 0 END) B
FROM (
SELECT *
FROM (
SELECT cats,
var1,
var2,
var3
FROM @Table
)p
UNPIVOT (Vars FOR MyVars IN (var1, var2,var3)) AS up
) sub
GROUP BY MyVars,
cats
ORDER BY 1, 2