Postgresql星型模式枢轴查询?

时间:2016-08-24 18:39:24

标签: postgresql pivot spss crosstab star-schema

我有一个中等大小的数据库,它位于一个星形图式中,有四个外星分支。对于我正在评估的一个特定的可视化软件,我需要将此数据库查询到一个SPSS文件中,其中一个外部分支转入列。我是PostgreSQL的新手,所以也许有一些我想念的简单方法。

这是一些示例数据(只有2个外部分支表 - 态度和人):

mainTable
id    |   attitudeKey  |    response   |   personKey
1     |       4        |      3        |      2
2     |       1        |      2        |      2
3     |       4        |      1        |      1
4     |       1        |      4        |      1
5     |       5        |      3        |      1

attitudeTable
attitudeKey    |     attitudeName
4              |       happy
1              |       quiet
5              |       grumpy

personTable
personKey      |     personName    |    personAge
1              |        Bob        |       35
2              |        Amy        |       30

And here is what the final result of the query needs to look like:
personKey  |   happy   |   quiet  |   grumpy   |   personName   |   personAge
1          |     1     |    4     |     3      |      Bob       |      35
2          |     3     |    2     |            |      Amy       |      30

我确信有一种方法可以从SQL获取此查询,但我只是没有足够的经验来编写连接和数据透视表。任何帮助是极大的赞赏。感谢。

我应该提一下,列的排序与最终结果无关。

现在我只是处理R中的数据,但这非常麻烦,我觉得使用交叉表进行简单的SQL查询会让我的生活变得更加轻松。

1 个答案:

答案 0 :(得分:0)

您可以使用交叉表功能创建数据透视表。 在使用这些示例之前,您需要安装扩展程序:

  

创建扩展表功能

您还需要仔细排序数据。手册:

  

在实践中,SQL查询应始终指定ORDER BY 1,2以确保输入行正确排序,即,将具有相同row_name的值放在一起并在行内正确排序。

您需要使用“ personKey”和态度名称对数据进行排序,以便将正确的值放入正确的列中。

之后,您可以执行此查询。 :

select ct."personKey",ct.happy,ct.quiet,ct.grumpy,ct."personName",ct."personAge"
from crosstab($$
select t.person_key,
   p.person_name,
   p.person_age,
   a.attitude_name,
   t.response
from main_table t
 join person_table p on p.person_key = t.person_key
 join attitude_table a on a.attitude_key = t.attitude_key
order by 1,
     case t.attitude_key
       when 4 then 1
       when 1 then 2
       else 3
     end
$$,
$$
select t.attitude_name
from attitude_table t
order by case t.attitude_key
       when 4 then 1
       when 1 then 2
       else 3
     end
$$) 
as ct("personKey" INTEGER, "personName" TEXT,"personAge" INTEGER, happy INTEGER, 
quiet INTEGER, grumpy INTEGER)