sql - 如何使用 postgresql 中的 group by 子句获取关联表列的值?
问题描述
有 3 个表,即 items、fields 和 field_values,如下所示。我根据两个字段 item.name 和 fields.name 对记录进行分组。我希望 sql 查询返回 items.name、sum(items.qty) 和 field_values.value 数组(与分组记录相关联)。
表项
ID | 姓名 | 数量 |
---|---|---|
1 | 面条 | 1 |
2 | 饼干 | 1 |
3 | 文件 | 1 |
表字段
ID | 姓名 |
---|---|
1 | 分行代码 |
2 | 分公司经理姓名 |
表 field_values
ID | 价值 | item_id | field_id |
---|---|---|---|
1 | 分公司1 | 1 | 1 |
2 | 分公司2 | 2 | 1 |
3 | 办事处分部 3 | 1 | 1 |
4 | 办事处 4 | 1 | 1 |
5 | 办事处分部 5 | 3 | 1 |
预期:根据表 field_values 中的数据
总数量为 3 的项目面条与办公室分店 1、办公室分店 3、办公室分店 4 链接
数量 1 的项目饼干与分公司 2 链接
数量为 1 的项目文件与办公室分支 5 链接
预期结果
姓名 | 数量 | Delivery_to_branches |
---|---|---|
面条 | 3 | {"办公室分支 1","办公室分支 3","办公室分支 4"} |
饼干 | 1 | {"分公司 2"} |
文件 | 1 | {"办公室分部 5"} |
我正在运行以下 sql 查询:
SELECT
items.name,
sum(qty) AS quantity,
array(
SELECT field_values.value
FROM field_values
WHERE field_values.item_id IN (
SELECT ID FROM items
)
AND fields.name = 'branch code'
) AS "delivery_to_branches"
FROM
items
INNER JOIN field_values ON field_values.item_id = items.id
INNER JOIN fields ON field_values.field_id = fields.id
GROUP BY
items.name, fields.name
字段 delivery_to_branches 得到意外结果
当我执行上面的 Sql 查询时,我得到了正确的名称和数量值,但数组值显示为 delivery_to_branches 不正确。任何帮助将不胜感激,谢谢!
姓名 | 数量 | Delivery_to_branches |
---|---|---|
面条 | 3 | {"办公室分支 1", "办公室分支 2","办公室分支 3","办公室分支 4", "办公室分支 5"} |
饼干 | 1 | {"办公室分支 1", "办公室分支 2","办公室分支 3","办公室分支 4", "办公室分支 5"} |
文件 | 1 | {"办公室分支 1", "办公室分支 2","办公室分支 3","办公室分支 4", "办公室分支 5"} |
解决方案
我认为您只想array_agg()
在带有过滤器的外部查询中:
SELECT i.name,
SUM(qty) AS quantity,
ARRAY_AGG(fv.value) FILTER (WHERE f.name = 'branch code') as delivery_to_branches
FROM items i JOIN
field_values fv
ON fv.item_id = i.id JOIN
fields f
ON fv.field_id = f.id
按 i.name 分组;
推荐阅读
- python - 如何在 Django 视图中渲染对象?
- c++ - 如何在c ++中取每n个元素的平均值
- python - 如何平均包含一个框架的所有窗口?
- tensorflow - SVHN 数据问题
- python - 如何在 re.search() 中使用两种模式?
- jquery - 如何将 div 分离并添加到没有唯一 ID 的父 div
- jquery - 添加到购物车重复的产品
- sql - 关于 select 1 from dual where exists 你如何解释这个 SQL 代码
- entity-framework - 实体框架和 SQL Server Compact Edition DDEX 提供程序
- c - 从图像文件读取时 fclose() 上的 SIGABRT