SQL(postgres):总结一个表更简单的方法?

时间:2015-08-17 21:52:33

标签: sql postgresql

这里有点101,但我有一个临时表填充如下:

SELECT name, department, SUM(items) items INTO TEMPORARY TABLE foo 
FROM other_table 
GROUP BY name, department;

这就是要点,大约有50列,所以有50个SUM()来电。然后我有另外一个汇总:

INSERT INTO foo SELECT name, 'sales', SUM(items) items 
FROM foo 
WHERE department in ('a', 'b') 
GROUP BY name;

这有点繁琐的脚本 - 写入明确的列数和部门汇总/拆分(和速度),我想知道是否有一些方法来更有效地这样做。虽然这可能是唯一的方法。

3 个答案:

答案 0 :(得分:1)

使用具有列编辑模式的不错的编辑器,获取表的列列表并编辑它们以获得所需的任何函数都是微不足道的。

所以:

\d my_table

然后将结果复制到编辑器中,修剪掉脂肪,用“Sum(”和“)”包围列名称,然后将列名称复制为列别名,后面加逗号。

我使用Sublime Text 2,但UltraEdit或几乎所有“专业”文本编辑器都会这样做。

答案 1 :(得分:0)

为了便于使用,请尝试查看物化视图...

http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html

其他选项包括将查询放入视图中,每次引用视图时都会运行查询(您甚至可以将其设置为“临时”,在会话结束时将其删除)。

答案 2 :(得分:0)

你能一下子把它们全部加起来吗?

SELECT 
  name, 
  department, 
  SUM(items)   AS items, 
  SUM(alpha)   AS alpha,
  SUM(bravo)   AS bravo
  SUM(charlie) AS charlie,
  SUM(delta)   AS delta   -- etc as required
INTO TEMPORARY TABLE foo 
FROM other_table 
GROUP BY name, department;

然后只使用INSERT中的相关列:

INSERT INTO foo SELECT name, 'sales', SUM(items) items 
FROM foo 
WHERE department in ('a', 'b') 
GROUP BY name;

INSERT INTO foo SELECT name, 'alpha', SUM(alpha) items 
FROM foo 
WHERE department in ('a', 'b') 
GROUP BY name;

甚至可能;

INSERT INTO foo SELECT name, 'alpha', SUM(alpha) items, 
                             'bravo', SUM(bravo) bravo -- etc 
FROM foo 
WHERE department in ('a', 'b') 
GROUP BY name;