零/空案例技巧
在《SQL 入門》一書中,Thomas Nield 談到了一種他稱之為零/空案例技巧的技術:
有一個簡單但功能強大的工具可以將不同的過濾條件應用於不同的聚合。當龍捲風存在與不存在於兩個單獨的列中時,我們可以創建單獨的總計數:
SELECT year, month, SUM(CASE WHEN tornado = 1 THEN precipitation ELSE 0 END) as tornado_precipitation, SUM(CASE WHEN tornado = 0 THEN precipitation ELSE 0 END) as non_tornado_precipitation FROM station_data WHERE year >= 1990 GROUP BY year, month
我們有效地做的是在 tornado = 1 或 tornado = 0 時去掉 WHERE 條件,然後將這些條件移動到 SUM() 函式內的 CASE 表達式。如果滿足條件,則將降水值添加到總和中。如果不是,則添加一個 0,沒有任何效果。我們對兩列都執行這些操作,分別針對龍捲風存在的時間和龍捲風不存在的時間。
您可以根據需要使 CASE 表達式具有盡可能多的條件/值對,從而使您能夠對聚合進行高度特定的值截取。您還可以使用此技巧來模擬交叉表和數據透視表,將聚合表示為單獨的列而不是行。一個常見的例子是進行當年/上一年的分析,因為您可以用不同的列表示不同的年份。
作為一個新手,該技術似乎可以非常方便地匯總數據。我想在網上查找該技術,以便可以在書籍或其他資源中找到類似的其他技術。
那本書的作者稱該技術為“零/空案例技巧”。但是當我用Google搜尋這個詞時,我沒有得到很多結果。
問題:
該技術是否有一個普遍接受的名稱?(線上搜尋時會產生更多結果)
它被稱為:
它可以使用SQL:2003 引入的語法顯式編寫,也可以
CASE
等效地使用語法編寫,例如. 目前 Postgres、HSQLDB 和 SQLite 支持新語法。FILTER``COUNT(*) FILTER (WHERE tornado = 1)
Excel(可能還有其他電子表格軟體)將此稱為“數據透視表”,因為您採用基於行的組,並在將它們放入列時將它們基本旋轉 90 度。
由於人們熟悉該術語,因此它延續到了 SQL 世界。例子
請注意,這不一定是最好的方法,可能還有其他技術,如條件聚合 (
FILTER
) 和視窗函式可用。(但我對甲骨文一無所知。)