在《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 表达式具有尽可能多的条件/值对,从而使您能够使用聚合对值进行高度特殊的截取。您还可以使用此技巧来模拟交叉表和数据透视表,将聚合表示为单独的列而不是行。一个常见的例子是进行当年/上一年的分析,因为您可以用不同的列表示不同的年份。
作为一个新手,该技术似乎可以非常方便地汇总数据。我想在网上查找该技术,以便可以在书籍或其他资源中找到类似的其他技术。
那本书的作者称该技术为“零/空案例技巧”。但是当我用谷歌搜索这个词时,我没有得到很多结果。
问题:
该技术是否有一个普遍接受的名称?(在线搜索时会产生更多结果)
它被称为:
它可以使用SQL:2003 引入的语法显式编写,也可以
CASE
等效地使用语法编写,例如. 目前 Postgres、HSQLDB 和 SQLite 支持新语法。FILTER
COUNT(*) FILTER (WHERE tornado = 1)
Excel(可能还有其他电子表格软件)将此称为“数据透视表”,因为您采用基于行的组并在将它们放入列时将它们基本旋转 90 度。
由于人们熟悉该术语,因此它延续到了 SQL 世界。例子
请注意,这不一定是最好的方法,可能还有其他技术,如条件聚合 (
FILTER
) 和窗口函数可用。(但我对甲骨文一无所知。)