[英]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.