簡體   English   中英

你如何在查詢中選擇有和沒有 WHERE 的地方?

[英]How Do You SELECT Both With and Without a WHERE in a Query?

我有一個表my_table ,其中包含如下數據:

+---------------------------+
|Accesses | Fruit   | Level |
+---------------------------+
|      5  | Apple   |     2 |
|      2  | Banana  |     3 |
|      2  | Apple   |     1 |
|      6  | Cherry  |     4 |
|     12  | Apple   |     4 |
|      9  | Banana  |     1 |
|      1  | Durian  |     2 |
+---------------------------+

我正在嘗試編寫一個查詢,該查詢將對 GROUP BY 水果的訪問次數和每個水果的訪問總數求和,但僅對級別小於 4 的訪問進行求和。該查詢的結果將是:

+---------------------------|-------------- +
|Fruit   | FilteredAccesses | TotalAccesses |
+---------------------------+---------------+
|Apple   |                7 |            19 | 
|Banana  |               11 |            11 |
|Durian  |                1 |             1 |
+-------------------------------------------+

我嘗試了以下自連接,但沒有得到預期的結果:

SELECT A.Fruit, SUM(A.Accesses) AS FilteredAccesses, SUM(B.Accesses) As TotalAccesses
FROM my_table A, my_table B
WHERE (A.Fruit = B.Fruit) AND (A.Level < 4)
GROUP BY A.Fruit

有什么我想念的嗎? 這甚至可以通過自連接來完成嗎?

使用條件聚合:

SELECT A.Fruit, SUM(CASE WHEN A.LEVEL < 4 THEN A.Accesses ELSE 0 END) AS FilteredAccesses,
      SUM(A.Accesses) As TotalAccesses
FROM my_table A
GROUP BY A.Fruit

不需要自我加入。 您可以在單個聚合查詢中執行此操作。 訣竅是在level上使用case表達式來計算“過濾”訪問,以便只考慮滿足條件的行。

select fruit,
    sum(case when level < 4 then accesses else 0 end) filtered_accesses,
    sum(accesses) total_accesses
from mytable
group by fruit

這種技術稱為條件聚合

暫無
暫無

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

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