我对如何根据PostgreSQL上的几个查询结果制作计算的数据透视表有疑问。我设法取得了三个查询结果,但不知道如何将所有数据组合并计算到一个表中。我尝试用Google搜索它,但发现大部分问题都与如何从单个表中创建数据透视表有关,我可以使用sum
,case
和{ {1}}。好吧,这是我查询结果的简化版本
来自查询1的查询,其中包含总价值
group by
查询2的结果,其中包含正调整
| city | code | gross |
|-------|------|--------|
| city1 | 21 | 194793 |
| city1 | 25 | 139241 |
| city1 | 28 | 231365 |
| city2 | 21 | 282025 |
| city2 | 25 | 334458 |
| city2 | 28 | 410852 |
| city3 | 21 | 109237 |
查询3的结果,其中包含负调整
| city | code | adj_pos |
|-------|------|---------|
| city1 | 21 | 16259 |
| city1 | 25 | 13634 |
| city1 | 28 | 45854 |
| city2 | 25 | 18060 |
| city2 | 28 | 18220 |
我想要要做的是创建这样的内容
| city | code | adj_neg |
|-------|------|---------|
| city1 | 25 | 23364 |
| city2 | 21 | 27478 |
| city2 | 25 | 23474 |
或者可能是来自总+正调整的最终计算-
每个城市对每个代码的负面调整是这样的
| city | 21_gross | 25_gross | 28_gross | 21_pos | 25_pos | 28_pos | 21_neg | 25_neg | 28_neg |
|-------|----------|----------|----------|--------|--------|--------|--------|--------|--------|
| city1 | 194793 | 139241 | 231365 | 16259 | 13634 | 45854 | | 23364 | |
| city2 | 282025 | 334458 | 410852 | | 18060 | 18220 | 27478 | 23474 | |
| city3 | 109237 | | | | | | | | |
任何建议将不胜感激。谢谢!
答案 0 :(得分:0)
我认为您可以实现的最好办法是将枢轴部分作为JSON-http://sqlfiddle.com/#!17/b7d64/23:
select
city,
json_object_agg(
code,
coalesce(gross,0) + coalesce(adj_pos,0) - coalesce(adj_neg,0)
) as js
from q1
left join q2 using (city,code)
left join q3 using (city,code)
group by city