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



我有一个像这样的表格

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"

问题是我必须对列存在的值求和,但基于以下 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 

首先,我将首先使用行而不是列对所有这些数据求和和命名。您可以包含要获取的(可选(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 没有行,则它根本不存在。如果您需要这些数据,则必须想出一种方法来生成空白行。一种方法是拥有一个表,视图或子查询,仅返回每个国家/地区的名称。然后让另一个返回每个时间段,另一个返回每个日期。然后,您将外部联接到这些表中的每一个,这将有助于生成"空白行"。

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

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

在"以行格式获取数据"的初始过程完成后,现在您将不得不执行"透视"以将行切换到列......如前所述,这不是SQL本机或容易做的事情。最简单的解决方案是使用 NON-SQL 解决方案,通过应用代码将数据转换为数组、对象或其他形式。当然,这也可以使用 pl/PGSQL 或其他数据库语言来完成,或者,可以在 SQL 中进行改革,以您想要的格式返回 JSON 数据。当然,你的应用仍然需要正确解释JSON,这在逻辑上得出的结论是,如果你可以编写应用代码,你应该做最简单的事情。最简单的解决方案是在 SQL 中对数据进行"分组/求和",然后遍历它并在应用程序代码中构建最终数据集。

最新更新