PostgreSQL 中的数据透视表

Pivot in PostgreSQL

我正在尝试找到一种在 Postgres 中进行数据透视的方法,但我无法使用它,因此我正在尝试寻找另一种方法。我发现以下网站解释了 SQL 服务器中的枢轴,在示例中,一个正是我想要做的。 http://sqlhints.com/2014/03/10/pivot-and-unpivot-in-sql-server/

例子是:

CREATE TABLE CourseSales(Course VARCHAR(50),Year INT,Earning  MONEY);

INSERT INTO CourseSales VALUES('.NET',2012,10000);
INSERT INTO CourseSales VALUES('Java',2012,20000);
INSERT INTO CourseSales VALUES('.NET',2012,5000);
INSERT INTO CourseSales VALUES('.NET',2013,48000);
INSERT INTO CourseSales VALUES('Java',2013,30000);

使用数据透视函数查询如下:

SELECT *FROM CourseSales
PIVOT(SUM(Earning)       
FOR Course IN ([.NET], Java)) AS PVTTable;

我想在 postgresql 中做同样的事情,但使用与上面类似的动态方式。

我自己对 postgresql 不是很熟悉,但是有一种替代的日期透视方法,通俗地称为交叉表透视。这是一个如何重写上面的查询的示例,我很确定所有这些运算符都将存在于 postgre

CREATE TABLE CourseSales(Course VARCHAR(50),Year INT,Earning  MONEY);

INSERT INTO CourseSales VALUES('.NET',2012,10000);
INSERT INTO CourseSales VALUES('Java',2012,20000);
INSERT INTO CourseSales VALUES('.NET',2012,5000);
INSERT INTO CourseSales VALUES('.NET',2013,48000);
INSERT INTO CourseSales VALUES('Java',2013,30000);

-- Your version (AKA TSQL)
SELECT *FROM CourseSales
PIVOT(SUM(Earning)       
FOR Course IN ([.NET], Java)) AS PVTTable;

-- Cross-tab
select 
    Year,
    sum(case when Course = '.NET' then Earning else 0 end) as net,
    sum(case when Course = 'Java' then Earning else 0 end) as java
from CourseSales
group by year

这是一篇关于交叉表数据透视表的文章。同样,我知道这是特定于 TSQL 的,但是运算符应该允许在任何 ansi sql 方言中使用类似的功能。

http://www.sqlservercentral.com/articles/T-SQL/63681/

不幸的是,我无法找到一种方法来使用 postgresql 来调整我的 table 并得到我需要的形式的结果,但我尝试这样做它在 R 上,我发现它更容易。

我将我的 postgres 数据库与 R 连接,然后我使用重塑包在我的 table 中执行一个枢轴。

对于任何想使用我的方法的人来说,这就是我所做的。

首先将R连接到数据库。

library(RPostgreSQL)
#create driver
dDriver <- dbDriver("PostgreSQL")
#connect to the server
conn <- dbConnect(dDriver, user="user", password="mypassword", dbname="postgres")

然后使用整形包

library(reshape)

获取 table

rs_CourseSales <- dbSendQuery(conn, 'SELECT * FROM CourseSales;')
dbRows_CourseSales <- fetch(rs_CourseSales, -1)

枢轴:

pivot_CourseSales<-(cast(dbRows_CourseSales,  Course ~ Year))

我发现这个例子非常有用: http://www.r-bloggers.com/pivot-tables-in-r/