簡體   English   中英

在AGGREGATE FUNCTION中的CASE內部存在

[英]EXISTS inside CASE inside AGGREGATE FUNCTION

我正在嘗試做類似這樣的事情:

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元素。 我喜歡這個答案,所以我試圖實現它沒有錯誤。

(注意:我非常感謝所有其他答案,因為它們顯示了可以適合我情況的可能解決方案)

因為,如消息所示,您不能在聚合函數( 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>
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>

從您提供的初始內容中得到一個簡單的答案:

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

您的查詢是一個聚合查詢,因此意圖似乎返回一行。 因此,只需將所有條件移至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>
             );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM