Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres-从多个表中选择字段作为列的查询_Sql_Postgresql_Join - Fatal编程技术网

Sql Postgres-从多个表中选择字段作为列的查询

Sql Postgres-从多个表中选择字段作为列的查询,sql,postgresql,join,Sql,Postgresql,Join,我有下列表格 表1:产品 id name 1 Bread 2 Bun 3 Cake 表2:费用项目 product| quantity 1 | 100 2 | 150 3 | 180 1 | 25 2 | 30 表3:收入项目 product| quantity 1 | 100 2 | 150 3 | 180 1 | 25 2 |

我有下列表格

表1:产品

id  name  
1   Bread  
2   Bun  
3   Cake  
表2:费用项目

product| quantity  
1 |      100  
2 |      150  
3 |      180  
1 |      25  
2 |      30  
表3:收入项目

product| quantity  
1 |      100  
2 |      150  
3 |      180  
1 |      25  
2 |      30  
现在我想要这样的结果

product   |  sum of quantity of expenseitem | sum of quantity of income item  
1         |  125 |  125  
2         |  180 |  180  
3         |  180 |  180
获取此结果的查询是什么? 谢谢

您可以尝试在子查询中使用UNION ALL,并在聚合函数中使用条件

模式PostgreSQL v9.6

问题1

您可以尝试在子查询中使用UNION ALL,并在聚合函数中使用条件

模式PostgreSQL v9.6

问题1


与@D-Shih的答案类似,PostgreSQL 9.4+支持条件聚合子句来代替CASE语句:

SELECT p.id,
       SUM(quantity) FILTER (WHERE grp = 1) SUMExpenseItems,
       SUM(quantity) FILTER (WHERE grp = 2) SUMIncomeItems
FROM 
     -- ...same union all query...
GROUP BY p.id

与@D-Shih的答案类似,PostgreSQL 9.4+支持条件聚合子句来代替CASE语句:

SELECT p.id,
       SUM(quantity) FILTER (WHERE grp = 1) SUMExpenseItems,
       SUM(quantity) FILTER (WHERE grp = 2) SUMIncomeItems
FROM 
     -- ...same union all query...
GROUP BY p.id

投票赞成包含SQL以创建测试数据。请注意,除了UNION之外,您还运行条件聚合。@holdenweb。公平地说,OP应该已经设置了这个可复制的示例,即使是使用SQLFiddle或Rextester。回答者往往比海报做得更多。投票赞成使用SQL来创建测试数据。请注意,除了UNION之外,您还运行条件聚合。@holdenweb。公平地说,OP应该已经设置了这个可复制的示例,即使是使用SQLFiddle或Rextester。回答者往往比海报做更多的工作。由于这两种结构相似,因此有空间通过将支出和收入指标列合并到一个项目表中来实现正常化。由于这两种结构相似,通过合并到一个项目表中,并带有支出和收入的指标列,可以实现正常化。具体取决于版本。在工作中,我们仍然使用9.3,所以必须使用用例。这取决于什么版本。在工作中,我们仍然使用9.3,因此必须使用用例。
SELECT p.id,
       SUM(quantity) FILTER (WHERE grp = 1) SUMExpenseItems,
       SUM(quantity) FILTER (WHERE grp = 2) SUMIncomeItems
FROM 
     -- ...same union all query...
GROUP BY p.id