如何使用自动完成 WHEN 子句进行 SUM

Posted

技术标签:

【中文标题】如何使用自动完成 WHEN 子句进行 SUM【英文标题】:How SUM with autocomplete WHEN-clause 【发布时间】:2018-10-16 13:50:56 【问题描述】:

我有一张这样的桌子

munic | origin  | date       | hour     | presence 
9875  | Germany | 2016-10-08 | 15:00:00 | 56
9875  | French  | 2016-10-08 | 18:00:00 | 24
9875  | Italians| 2016-10-08 | 18:00:00 | 6

使用 SUM,我可以根据以下条件对价值求和:

SELECT munic, 
       SUM(presence) FILTER (WHERE origin = 'Germany' AND date = '2016-10-08' AND hour = '15:00:00') AS "Germany_2016-10-08_15:00:00"

问题是我必须对 presence 列中的值求和,但基于以下 3 个字段的太多条件(8 天 x 8 小时块 x 12 个国家/地区 = 768 种组合) , 过多的过滤子句无法通过键盘编写。这个想法是为新闻表中三个字段的每个组合获得一个特定的总和。 有没有一种方法可以根据一般规则自动选择组合,而不是编写每个过滤器子句?

那么第二个问题是在新表中,如何用类似于用于求和的三个字段的值的连接来命名每个新列。

结果可以是:

   munic | Germany_2016-10-08_15:00:00 | French_2016-10-08_18:00:00 | Italians_2016-10-08_18:00:00
 9875    |    54                      |      24           |       6 

【问题讨论】:

SQL 要求在执行该语句之前 知道 select 语句的所有列的数量、名称和类型。所以你所要求的基本上是不可能的。然而,创建多行是很容易的,其中每一行是一个组合,然后对它们进行一些操作。使用一些前端工具可以轻松转换结果(也称为“Pivot”)。 SQL 和普通字段行不适用于此任务。您可以以编程方式构建该数据,也可以输出 JSON 对象。你对此持开放态度吗?您使用什么语言编写程序? 【参考方案1】:

首先,我首先将所有这些数据汇总并使用行而不是列命名。您可以包含一个(可选的)where 子句来获取

 SELECT munic, origin, date, hour, sum(presence) 
  from my_tab
  /*OPTIONAL where clause to limit to specific countries, origins, dates, hours*/
  WHERE origin in ('Germany','Italy','France',....)
   and date in ('2016-10-08','2016-10-09',...)
  group by munic, origin, date, hour

通过上面编写的查询,您将获得所需的数据,以行(而非列)形式。此外,您不会得到不存在数据的“空白”行。示例:如果“德国”没有 2016-10-08 18:00:00 的行,那么它根本就不存在。如果您需要该数据,则必须想出一种方法来生成空白行。这样做的一种方法是有一个简单地返回每个国家/地区名称的表、视图或子查询。然后有另一个返回每个时间段,另一个返回每个日期。然后你 OUTER JOIN 到这些表中的每一个,这将有助于生成你的“空白行”。

此外,不用说,您的日期、营业时间或国家/地区列表将来可能需要更改(例如:您现在正在运行“2016-10-08”,但您可能需要其他日期( ) 下次运行此查询时,另外一个问题是如何使此查询在每次以不同方式运行“报告”时都不需要进行大量编辑。

大部分问题将由您决定什么是最有意义的(我们是完全限制数据,还是只获取所有数据……是根据“开始日期”+ X 年查询的日期,等等...)根据您提供的信息,很难说在这方面有什么帮助。

在“以行格式获取数据”的初始过程完成后,现在您将不得不执行“枢轴”以将行切换为列...如前所述,这不是 SQL本机或轻松地做。最简单的解决方案是使用非 SQL 解决方案,使用应用程序代码将您的数据改造成数组、对象或其他形式。当然,这也可以使用 pl/PGSQL 或另一种 DB 语言来完成,或者,可以(付出很大的努力)在 SQL 中进行改造,以返回您想要的格式的 JSON 数据。当然,您的应用程序仍然需要正确解释 JSON,这从逻辑上得出这样的结论:如果您可以编写应用程序代码,您应该做最简单的事情......最简单的解决方案是“Group/SUM” SQL 中的数据,然后遍历它并在应用程序代码中构建最终数据集。

【讨论】:

以上是关于如何使用自动完成 WHEN 子句进行 SUM的主要内容,如果未能解决你的问题,请参考以下文章

C++ 的 #include 子句的 Vim 自动完成

PostgreSQL 分组聚合查询中 filter 子句替换 case when

ORDER BY 子句的 CASE WHEN 语句

如何正确使用 sum (case ... when ... then ...)?

如何判断何时未使用谷歌位置自动完成建议?

如何移出 IntelliJ IDEA 中的自动完成括号(不使用箭头键)?