【问题标题】:Combine 2 results of sql join into one result将sql join的2个结果合并为一个结果
【发布时间】:2020-12-03 15:06:36
【问题描述】:

我正在处理一项任务,我需要以以下格式获取和显示 postgres 数据库数据。

我正在尝试的查询是,

select fv.integer_value as source_id, fv.string_value as source_name, p.amount as amount from payment p 
    INNER join user u on p.user_id = u.id  
        INNER join customer c on u.id = c.user_id
        INNER JOIN customer_field_map cfm ON cfm.customer_id = c.id
        INNER JOIN field_value fv ON cfm.field_value_id = fv.id
        INNER JOIN field_name fn ON fn.id = fv.field_name_id
        WHERE fn.name in ('source_id', 'source_name')
    group by source_id, source_name, amount;

field_value 表结构是这样的,

field_value (
    id,
    field_name_id,
    integer_value,
    String_value
)

考虑以下分布在userfield_namefield_value 等表中的用户记录,

user_id  source_id   source_name   amount
10        100         source-1      100

对于上面的记录,上面的 sql 查询给了我 2 个结果,例如,

任何建议如何实现所需的结果并将 2 个结果合二为一,如开头的图片所示。

source_id 和 source_name 组合不会改变,但多个用户可以有相同的组合。

编辑

详细的表格结构和示例数据在以下几行,

user (
id integer,
user_name character varying (100)
)

id    name
------------------------
100  test-name

customer (
id integer,
user_id integer
)

id      user_id
------------------------
100     100

payment (
 id integer,
 user_id integer,
 amount numeric
)

id      user_id   amount
------------------------
100     100       100


field_name (
 id integer,
 name character varying (100)
)

id      name
------------------------
100     source_id
101     source_name

field_value (
    id,
    field_name_id,
    integer_value,
    String_value
)

id      name     integer_value     string_value   
----------------------------------------------------
100     100       101             null  
101     101       null            source-1


customer_field_map (
   customer_id integer,
   field_value_id integer  
)

customer_id     field_value_id
----------------------------------------------------
100              100
100              101 

【问题讨论】:

  • 请给我们看表数据。请将其作为可复制文本而不是图像插入问题!
  • @S-Man 添加了一些关于表结构和示例数据的细节

标签: sql postgresql join


【解决方案1】:

您的逻辑有点难以理解,因为您的查询返回三列但数据有四列。

如果您想要每个用户一行,那么group by 应该只包含一个键——u.id。所以:

select u.id, max(fv.integer_value) as source_id,
       max(fv.string_value) as source_name, p.amount as amount
from payment p join
     user u
     on p.user_id = u.id join
     customer c 
     on u.id = c.user_id join
     customer_field_map cfm 
     on cfm.customer_id = c.id join
     field_value fv 
     on cfm.field_value_id = fv.id join
     field_name fn ON fn.id = fv.field_name_id 
where fn.name in ('source_id', 'source_name')
group by u.id;

【讨论】:

  • source_id、source_name 组合可以跨用户复制。这意味着多个用户可以具有相同的 source_id、source_name 值。在这种情况下,根据您建议的查询,结果按用户 ID 分组,并且我得到 source_id、source_name 的相同组合的多个结果。我想获得 source_id、source_name 的唯一组合的付款总和。
猜你喜欢
  • 2017-01-31
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多