【发布时间】:2016-10-04 05:33:21
【问题描述】:
我还是 SQL 的新手,我正在研究整个子查询聚合以显示一些结果,并正在寻找一些建议:
表格可能类似于:
Customer: (custID, name, address)
Account: (accountID, reward_balance)
Shop: (shopID, name, address)
关系表:
Holds (custID*, accountID*)
With (accountID*, shopID*)
如何找到reward_balance 最少的商店? (此时不需要客户信息)
我试过了:
SELECT accountID AS ACCOUNT_ID, shopID AS SHOP_ID, MIN(reward_balance) AS LOWEST_BALANCE
FROM Account, Shop, With
WHERE With.accountID = Account.accountID
AND With.shopID=Shop.shopID
GROUP BY
Account.accountID,
Shop.shopID
ORDER BY MIN(reward_balance);
这是一种非预期的方式:
ACCOUNT_ID | SHOP_ID | LOWEST_BALANCE
1 | 1 | 10
2 | 2 | 40
3 | 3 | 100
4 | 4 | 1000
5 | 4 | 5000
您可以看到 Shop_ID 4 实际上有 6000 (1000+5000) 的余额,因为有两个客户在其中注册。我想我需要根据他们的余额对商店的最低余额求和,并从低到高显示。
我一直在尝试在显示之前汇总数据,但这就是我失败的地方:
SELECT shopID AS SHOP_ID, MIN(reward_balance) AS LOWEST_BALANCE
FROM (SELECT accountID, shopID, SUM(reward_balance)
FROM Account, Shop, With
WHERE
With.accountID = Account.accountID
AND With.shopID=Shop.shopID
GROUP BY
Account.accountID,
Shop.shopID;
当我运行类似这样的语句时,我得到一个无效的标识符错误。
Error at Command Line : 1 Column : 24
Error report -
SQL Error: ORA-00904: "REWARD_BALANCE": invalid identifier
00904. 00000 - "%s: invalid identifier"
所以我认为我的加入条件可能不正确并且聚合排序不正确,并且非常感谢任何一般性建议。
感谢您的长时间阅读!
【问题讨论】:
-
尝试在您的内部选择中为
SUM(reward_balance) As reward_balance添加别名。 -
Hey Uporabnik003,我根据您的建议对其进行了编辑,但现在出现“列不明确定义”错误。
-
我不熟悉 Oracle,但尝试将其命名为
sum_reward_balance,然后更正主要语句。也许它需要一个唯一的名称,而不是与原始列名相同。