SELECT COUNT(*)
FROM TABLE1
WHERE COLUMN1='x1'
AND COLUMN2 ='Y1'
AND COLUMN3 = 'Z1'
AND COLUMN4 ='N1'
UNION ALL
SELECT COUNT(*)
FROM TABLE1
WHERE COLUMN1='x1'
AND COLUMN2 ='Y1'
AND COLUMN3 = 'Z1'
AND COLUMN4 ='N2'
UNION ALL...
值如下:
X1 Y1 Z1 N1:X1 Y1 Z1 N2:....
然后,
X1 Y1 Z2 N1:X1 Y1 Z2 N2:....
然后
X1 Y2 Z1 N1:X1 Y2 Z2 N2:....
然后
X2 Y1 Z1 N1:....并且整个过程重复。
FORMS 100至200 UNION ALLS。 我需要做的就是检查表中是否存在组合(COL1,COL2,COL3,COL4)(如果不存在,则Count将返回0)。
我知道这是编写查询的一种非常糟糕的方式,但我是一个新手。所以请帮忙。 感谢
答案 0 :(得分:2)
您可以使用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
答案 1 :(得分:0)
为什么这么多UNION ALL
语句?我看到谓词中只有column4
个值发生了变化。
对于column4,请尝试WHERE EXISTS
。并确保您具有where
子句中列出的列的必需索引。照顾索引中的leading column
。
通常,开发人员为所有要比较的值编写IN list
。但是,由于将对IN列表中的每个值扫描table
,因此效率不高。
此外,如果您不对前三列经常进行DML
更改,请创建PARTITION
以将这些值存储在该分区中。
而且,有任何性能调优问题,请始终提供执行计划和元数据信息。这有助于我们更好地了解您的问题。