为什么总和(余额)的值会发生变化?如何固定/连接这两张表



我很难理解为什么我的查询会更改余额总和的值。。。然后我就无法加入我原来需要的那张桌子了。

初始代码:

SELECT CASE WHEN state = 'AZ' THEN 'AZ' ELSE 'Non-AZ' END AS state
     , COUNT(DISTINCT m.member_id) AS "No of Members"
     , COUNT(issue_detail_id) AS "Num Checkouts"
     , COUNT(DISTINCT li.lib_item_id) AS "Items Borrowed"
     , SUM(balance)
  FROM lib2.members m
  JOIN lib2.issue_details id ON m.member_id = id.member_id
  JOIN lib2.library_item_copies lic ON id.item_copy_id = lic.item_copy_id
  JOIN lib2.library_items li ON lic.lib_item_id = li.lib_item_id
 GROUP BY CASE WHEN state = 'AZ' THEN 'AZ' ELSE 'Non-AZ' END;
    AZ  7   37  18  -165
Non-AZ  6   30  14  -160

但当我进行单独的查询时,我会得到预期的结果。。。

SELECT CASE WHEN state = 'AZ' THEN 'AZ' ELSE 'Non-AZ' END AS "State"
     , COUNT(DISTINCT m.member_id) AS "No of Members"
     , SUM(balance) AS bal
  FROM lib2.members m
 GROUP BY CASE WHEN state = 'AZ' THEN 'AZ' ELSE 'Non-AZ' END;
Non-AZ  6   -35
    AZ  7   -30

"sum(balance)"将对查询返回的每一行的余额求和。

单独执行查询时(第二种情况),lib2.members表中的每一行只处理一次。

当您将所有JOIN与其他表一起添加时,例如,如果某个特定成员有多个lib2.issue_details,则该成员的行将被处理多次,因此"sum(balance)"将不正确。

默认情况下,JOIN是内部联接。因此,Oracle将只保留所有联接为true的行。如果issue_details表不包含某些member_id,它将不计算这些行。您要使用的是LEFT JOIN。这可能就是问题所在,假设您的代码在语义上很好,并且联接条件是正确的。

最新更新