在AGGREGATE FUNCTION

时间:2016-04-13 14:00:50

标签: sql case aggregate-functions exists

我正在尝试做类似的事情:

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元素。我喜欢这个答案,所以我试图实现它没有错误。

(注意:我非常感谢所有其他答案,因为它们显示了适合我情况的可能解决方案)

4 个答案:

答案 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>
             );