您可以使用WHERE 子句来处理公共部分。然后使用 CASE 语句隐藏在 SUM 语句中的 column4 部分:
SELECT
SUM(CASE WHEN COLUMN4 = 'N1' THEN 1 ELSE 0 END) AS N1Count,
SUM(CASE WHEN COLUMN4 = 'N2' THEN 1 ELSE 0 END) AS N2Count
FROM TABLE1
WHERE COLUMN1 = 'x1'
AND COLUMN2 = 'Y1'
AND COLUMN3 = 'Z1'
这将阻止所有这些单独的 SELECT 语句的运行。
确保您在 COLUMN1、COLUMN2、COLUMN3 和 COLUMN4 上有索引也会有所帮助。
编辑 1:
SELECT
SUM(CASE WHEN
COLUMN1 = 'X1' AND COLUMN2 = 'Y1' AND COLUMN3 = 'Z1' AND COLUMN4 = 'N1'
THEN 1 ELSE 0 END) AS Count1,
SUM(CASE WHEN
COLUMN1 = 'X1' AND COLUMN2 = 'Y1' AND COLUMN3 = 'Z1' AND COLUMN4 = 'N2'
THEN 1 ELSE 0 END) AS Count2,
SUM(CASE WHEN
COLUMN1 = 'X1' AND COLUMN2 = 'Y2' AND COLUMN3 = 'Z1' AND COLUMN4 = 'N1'
THEN 1 ELSE 0 END) AS Count3,
SUM(CASE WHEN
COLUMN1 = 'X1' AND COLUMN2 = 'Y2' AND COLUMN3 = 'Z2' AND COLUMN4 = 'N2'
THEN 1 ELSE 0 END) AS Count4,
SUM(CASE WHEN
COLUMN1 = 'X2' AND COLUMN2 = 'Y1' AND COLUMN3 = 'Z1' AND COLUMN4 = 'N1'
THEN 1 ELSE 0 END) AS Count5,
AND ETC.....
FROM TABLE1
编辑 2:
您可以创建另一个表来保存 COLUMN1、COLUMN2、COLUMN3 和 COLUMN4 的所有不同变体。然后 JOIN 到该表并使用 GROUP BY 像这样:
SELECT tt.COLUMN1, tt.COLUMN2, tt.COLUMN3, tt.COLUMN4,
CASE WHEN t1.COLUMN1 IS NULL THEN 0 ELSE COUNT(1) END AS RecCount
FROM TABLE1 t1
RIGHT JOIN TempTable tt ON tt.COLUMN1 = t1.COLUMN1, tt.COLUMN2 = t1.COLUMN2,
tt.COLUMN3 = t1.COLUMN3, tt.COLUMN4 = t1.COLUMN4
GROUP BY tt.COLUMN1, tt.COLUMN2, tt.COLUMN3, tt.COLUMN4