我正在处理复杂的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的形式返回200。
如果要左连接,则不应使用左连接表(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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句