我正在处理复杂的SQL查询。只是为了说明我的问题,我已简化为以下简短查询:
select a.column1 as field1,b.column2 as field 2,c.column3 as field3,COALESCE(SUM(d.paid_amt) OVER (PARTITION BY a.some_column),0) as amount_paid
from a Inner join b on b.column3=ac.olumn2
right join c on c.column4=b.column1
left join d on d.column2=a.column1 and d.column5 = a.column1
where ...//some conditions
所以我很确定这里发生了什么。我对d表上的最后一个左联接更加关注。如果d表没有匹配d.column5 = a.column1
的记录,那么我没有任何结果。
但是我正在尝试以这种方式编写查询,如果d表使用where条件d.column5 = a.column1
重新调整了任何值,那么我想使用这些值,否则,如果d表中没有记录,我只是想从以前的联接结果中获取记录并获取我需要的记录。
在当前查询中,如果联接与where条件不匹配,则会消除所有记录,这是预期的问题。无论所在地条件是否满足,我都希望有记录。
我不太确定如何在一个查询中执行此操作。任何建议表示赞赏。
注意:@scaisEdge和@Zaynul Answer可以正常工作。但是问题是如果我在join和子句上移动条件,则数量计算。 amunt计算也应该在相同的条件下d.column5 = a.column1
。所以我不确定如何克服这个问题:(
下面的采样日期:
field1 | field2 | field3 | ampount_paid | some_column_to_match
--------------------------------------------------------------
name | value1 | other1 | 100 | 1
name1 | value2 | other2 | 100 | 1
name2 | value3 | other3 | 100 | 2
因此,我刚刚添加了最后几列,以说明我想要的总和。我只想在some_column_to_match
匹配的情况下对字段求和。所以我试图得到这样的输出:
field1 | field2 | field3 | amount_paid | some_column_to_match
--------------------------------------------------------------
name | value1 | other1 | 200 | 1
name1 | value2 | other2 | 200 | 1
name2 | value3 | other3 | 100 | 2
因此,基本上,计算应为amount_paid
值匹配的some_column_to_match
中所有值的总和。因此,在上面的示例中,前两列应在每个单独字段中以相同的值返回200,因为它等于100。
答案 0 :(得分:0)
如果要左联接,则不应在这种情况下将左联接表的列(d.column5 = a.column1)用作内部联接
在这种情况下,请在对应的ON格中为与左联接表相关的列添加条件
select a.column1
,b.column2
,c.column3
,d.column4
from a Inner join b on b.column3=ac.olumn2
right join c on c.column4=b.column1
left join d on d.column2=a.column1 AND d.column5 = a.column1