SQL派生表别名添加方法咨询及sale表特定统计需求求助
咱们一个一个来解决你的两个SQL问题哈!
问题1:搞定“Every derived table must have its own alias”报错
这个报错其实很好理解——当你把子查询当作一个临时表(也就是派生表)来使用时,必须给这个临时表起个别名,不然数据库根本不知道怎么称呼它,自然就报错了。
举个典型的错误写法,比如你想从sale表里筛选出金额大于100的记录,然后直接查询这个结果:
SELECT * FROM ( SELECT SONumber, TotAmount FROM sale WHERE TotAmount > 100 )
看到没?括号里的子查询就是个派生表,但没给它加别名,数据库就会抛出你遇到的那个错误。
解决方法超简单,给派生表加个别名就行,用AS关键字(AS可以省略,但加上可读性更强):
SELECT * FROM ( SELECT SONumber, TotAmount FROM sale WHERE TotAmount > 100 ) AS temp_sale -- 这里的temp_sale就是派生表的别名,名字随便取,符合规则就好
不管是在FROM子句里用派生表,还是用JOIN关联派生表,都得给它加别名。比如关联场景的正确写法:
SELECT s.CustomerID, temp.Total FROM sale s JOIN ( SELECT SONumber, SUM(TotAmount) AS Total FROM sale GROUP BY SONumber ) AS temp ON s.SONumber = temp.SONumber
这里的temp就是派生表的别名,这样数据库就能正常识别并执行了。
问题2:统计sale表中唯一SONumber对应的TotAmount总金额
这里得根据你的业务场景选对应的写法,我分两种常见情况说明:
场景1:每个SONumber仅对应一条记录
如果你的sale表里,每个SONumber只存在一条交易记录,那可以先取出所有不重复的SONumber及其对应的TotAmount,再求和:
SELECT SUM(TotAmount) AS `Total Amount` FROM ( SELECT DISTINCT SONumber, TotAmount FROM sale ) AS temp
内层子查询先筛选出唯一的SONumber和对应的金额,外层再对这些金额求和,得到最终的总金额。
场景2:每个SONumber有多条交易记录
如果同一个SONumber有多条交易,你需要先算出每个SONumber的总金额,再把这些总金额加起来:
SELECT SUM(total_per_so) AS `Total Amount` FROM ( SELECT SONumber, SUM(TotAmount) AS total_per_so FROM sale GROUP BY SONumber ) AS temp
内层子查询按SONumber分组,计算每个编号的累计金额total_per_so,外层再对这些累计值求和,得到所有唯一SONumber对应的总金额。
内容的提问来源于stack exchange,提问作者Nuwan Dissanayaka




