我有一个中等大小的数据库,它位于一个星形图式中,有四个外星分支。对于我正在评估的一个特定的可视化软件,我需要将此数据库查询到一个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查询会让我的生活变得更加轻松。
答案 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)