默认情况下,
我很难理解为什么我的查询会更改余额总和的值。。。然后我就无法加入我原来需要的那张桌子了。
初始代码:
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
。这可能就是问题所在,假设您的代码在语义上很好,并且联接条件是正确的。