我正在尝试做类似的事情:
SELECT SUM(
CASE WHEN (<some_condition>
AND EXISTS(SELECT 1
FROM <tableA> as tA
WHERE tA.Id = tB.tAId and
<some_other_condition>
)
) THEN 1 ELSE 0 END
) as <column_name>
FROM <tableB> as tB
我需要避免使用连接来实现我需要的东西,因为在这种情况下,我不希望计算通过join子句得到的结果返回的重复项。当我尝试执行查询时,收到以下错误消息:
“无法对包含聚合或子查询的表达式执行聚合函数”
我不知道我做错了什么。
任何帮助表示感谢。
编辑:我在WHERE语句中添加了一个可能的条件,只是为了表明我需要将外部表(tableB)的列与内部表(tableA)相关联。
这是tableA和tableB的一个例子,当我加入两者时会发生什么:
tableA: tableB: tableA JOIN tableB
Id Id tAId Time Id(A) Id(B) taId Time
1 1 1 5 1 1 1 5
2 2 2 6 2 2 2 6
3 3 2 10 2 3 2 10
4 4 3 11 3 4 3 11
5 5 4 14 4 5 4 14
6 4 13 4 6 4 13
7 4 12 4 7 4 12
8 5 10 5 8 5 10
因此,当我尝试使用JOIN操作的结果作为输入从tableA计算/求和某些属性(即tableA.Id)时,我最终计算重复项。这就是为什么我不能使用JOIN,除非我可以选择DISTINCT元素。我喜欢这个答案,所以我试图实现它没有错误。
(注意:我非常感谢所有其他答案,因为它们显示了适合我情况的可能解决方案)
答案 0 :(得分:0)
因为,正如消息所说,您不能在聚合函数(SUM()
)中使用子查询,请考虑使用类似于以下内容的连接:
SELECT SUM(
CASE WHEN (<some_condition>
AND tA.<matching_column> IS NOT NULL
) THEN 1 ELSE 0 END
) as <column_name>
FROM <tableB> tB
LEFT JOIN <tableA> tA
ON tA.Id = tB.Id
WHERE tA.<some_other_condition>
答案 1 :(得分:0)
SELECT SUM(
CASE WHEN (<some_condition>
AND tA.Id IS NOT NULL
) THEN 1 ELSE 0 END
) as <column_name>
FROM <tableB> as tB
JOIN (SELECT DISTINCT ta.Id
FROM <tableA>) as tA ON tA.Id = tB.Id AND <some_other_condition>
答案 2 :(得分:0)
只是简单回答你提供的内容:
SELECT SUM(<column_name>) AS SumColumn
FROM (
SELECT CASE WHEN <some_condition> AND EXISTS(SELECT 1 FROM <tableA> WHERE <some_other_condition>) THEN 1 ELSE 0 END as <column_name>
FROM <tableB>
)AS SUB
答案 3 :(得分:0)
您的查询是一个聚合查询,因此意图似乎返回一行。因此,只需将所有条件移至WHERE
子句即可。这是我对你的意图的最佳猜测:
SELECT COUNT(*) as <column_name>
FROM <tableB> tB
WHERE (<some_condition> AND
EXISTS (SELECT 1
FROM <tableA> as tA
WHERE tA.Id = tB.Id AND <some_other_condition>
);