Sql 连接同一行的实例

Sql 连接同一行的实例,sql,postgresql,left-join,Sql,Postgresql,Left Join,我有一个表h,包含这样的数据(好的,不是真的,这只是一个示例): 我想总结一下每个sub\u id的q值,得到如下输出: subj_id num1 num2 num3 1 2 1 null 2 5 2 4 3 3 null null select h.subj_id, n1.sum as num1, n2.sum as num2, n3.sum as num3 from

我有一个表
h
,包含这样的数据(好的,不是真的,这只是一个示例):

我想总结一下每个
sub\u id
的q值,得到如下输出:

subj_id   num1   num2   num3  
      1      2      1   null
      2      5      2      4
      3      3   null   null
select h.subj_id, n1.sum as num1, n2.sum as num2, n3.sum as num3 from ((( h
    left join (select subj_id, q1+q2+q3+q4+q5+q6 as sum from h where num=1) as n1 on h.subj_id=n1.subj_id)
    left join (select subj_id, q1+q2+q3+q4+q5+q6 as sum from h where num=2) as n2 on h.subj_id=n2.subj_id)
    left join (select subj_id, q1+q2+q3+q4+q5+q6 as sum from h where num=3) as n3 on h.subj_id=n3.subj_id) order by h.subj_id
但我得到的是以下信息:

subj_id   num1   num2   num3
      1      2      1   null
      1      2      1   null
      2      5      2      4
      2      5      2      4
      2      5      2      4
      3      3   null   null
当表中出现
sub\u id
时,求和行重复的次数相同

我的查询(postgres)如下所示:

subj_id   num1   num2   num3  
      1      2      1   null
      2      5      2      4
      3      3   null   null
select h.subj_id, n1.sum as num1, n2.sum as num2, n3.sum as num3 from ((( h
    left join (select subj_id, q1+q2+q3+q4+q5+q6 as sum from h where num=1) as n1 on h.subj_id=n1.subj_id)
    left join (select subj_id, q1+q2+q3+q4+q5+q6 as sum from h where num=2) as n2 on h.subj_id=n2.subj_id)
    left join (select subj_id, q1+q2+q3+q4+q5+q6 as sum from h where num=3) as n3 on h.subj_id=n3.subj_id) order by h.subj_id
左连接显然不是这里要使用的技巧,但是如何跳过重复的行呢


提前谢谢

您的查询可以轻松修改为:

with cte as (
    select subj_id, q1 + q2 + q3 + q4 + q5 + q6 as q, num
    from h
)
select
    subj_id,
    sum(case when num = 1 then q end) as num1,
    sum(case when num = 2 then q end) as num2,
    sum(case when num = 3 then q end) as num3
from cte
group by subj_id
order by subj_id
我认为这个计划会好得多——根本没有加入。

简要说明您的查询不起作用的原因以及如何改进:

  • 您会收到更多您想要的行,因为基本上您的查询所做的是从表
    h
    中选择每一行,然后使用
    num=1,2,3
    从表
    h
    中加入到它的sum。初始表中有6行,结果中有6行是合乎逻辑的
  • 如果您要进行类似的查询,我强烈建议您在内部查询中为表使用别名。我将帮助您理解查询。在某些情况下,它还可以帮助您避免错误的结果-请参阅本主题中的我的答案-
-


您的查询可以轻松修改为:

with cte as (
    select subj_id, q1 + q2 + q3 + q4 + q5 + q6 as q, num
    from h
)
select
    subj_id,
    sum(case when num = 1 then q end) as num1,
    sum(case when num = 2 then q end) as num2,
    sum(case when num = 3 then q end) as num3
from cte
group by subj_id
order by subj_id
我认为这个计划会好得多——根本没有加入。

简要说明您的查询不起作用的原因以及如何改进:

  • 您会收到更多您想要的行,因为基本上您的查询所做的是从表
    h
    中选择每一行,然后使用
    num=1,2,3
    从表
    h
    中加入到它的sum。初始表中有6行,结果中有6行是合乎逻辑的
  • 如果您要进行类似的查询,我强烈建议您在内部查询中为表使用别名。我将帮助您理解查询。在某些情况下,它还可以帮助您避免错误的结果-请参阅本主题中的我的答案-
-


您的解决方案既漂亮又绝对正确,非常感谢您的帮助和到Fiddle的链接(以及添加缺少的
sql
标记)。正如我的解决方案可能显示的那样,我对sql不太感兴趣。为了完整起见,你能给我解释一下为什么我的脚本中的行是重复的吗?谢谢@JanusEngstrøm添加了一些解释,请毫不犹豫地询问这是否还不够。您的解决方案既漂亮又绝对正确,非常感谢您的帮助和到Fiddle的链接(以及添加缺少的
sql
标记)。正如我的解决方案可能显示的那样,我对sql不太感兴趣。为了完整起见,你能给我解释一下为什么我的脚本中的行是重复的吗?谢谢@JanusEngstrøm补充了一些解释,如果这还不够,请毫不犹豫地询问