火星文 技术研习社

Noname Cat, Keep Thinking
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SQL 统计用户累计消费记录

Posted on 2006-06-05 19:00  剑廿三  阅读(1163)  评论(0)    收藏  举报
GROUP BY

* 不带日期

数据模型:http://photo.163.com/photos/kelven_vong/48662802/1366547565/

SQL 结果:http://photo.163.com/photos/kelven_vong/48662802/1366547565/

* 带日期

数据模型:http://photo.163.com/photos/kelven_vong/48662802/1366547597/

SQL 结果:http://photo.163.com/photos/kelven_vong/48662802/1366547582/



这是错误的:(报错 ORA-00979:不是一个 GROUP BY 表达式)

SELECT T_PRD_FOOTBALLUSERRECORD.FUSERID AS FUSERID, T_PRD_FOOTBALLUSERRECORD.FUSERNAME AS FUSERNAME,SUM(T_PRD_FOOTBALLUSERRECORD.FWINSCORE) AS WINSCORE
FROM T_PRD_FOOTBALLUSERRECORD,T_USR_USER 
WHERE T_PRD_FOOTBALLUSERRECORD.FUSERID=T_USR_USER.FID 
GROUP BY FUSERID

正确的是:

SELECT T_PRD_FOOTBALLUSERRECORD.FUSERID AS FUSERID, T_PRD_FOOTBALLUSERRECORD.FUSERNAME AS FUSERNAME,SUM(T_PRD_FOOTBALLUSERRECORD.FWINSCORE) AS WINSCORE
FROM T_PRD_FOOTBALLUSERRECORD,T_USR_USER 
WHERE T_PRD_FOOTBALLUSERRECORD.FUSERID=T_USR_USER.FID 
GROUP BY FUSERID,FUSERNAME

原因:

SELECT 语句中的非聚合表达式也出现在GROUP BY从句中,如果我们在SELECT语句中夹杂聚合与非聚合表达式,
SQL期望我们进行GROUP BY操作,我们必须在GROUP BY语句中列出所有的非聚合表达式。

上例中,FUSERNAME 就属于非聚合表达式了,因此要把它放到 GROUP BY 字句后面。

要注意的是,GROUP BY 后面跟的一定要是列名,不能是 AS 产生的别名。

关于 TOP N 和 ROWNUM

MS SQL Server 中的 “SELECT  TOP n  .....” 语句

对应 Oracle SQL 中的 “SELECT ....... FROM ...... WHERE ROWNUM <= n AND .....”

Oracle SQL 语法参考http://blog.donews.com/chenyajun/