1. 看例子
select day, duan, sum(amount) as sumamount from (select to_char(time,'yyyy-mm-dd') as day,(case
when (to_char(time, 'hh24:mi:ss') <
'12:00:00') then
'上午'
when (to_char(time, 'hh24:mi:ss') >
'12:00:00') then
'下午'
end) as duan,amount
from dh_mealrecord) group by cube(day,duan) order by day
这个SQL语句是统计每天上午和下午各自的营业额。
1.1select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面,比如duan
1.2Group by子句不能使用别名,要使用别名可以外加一层select
1.3case when之间可以空着,可以为(case when then end)的结果取别名,case when语句在from的前面,case when中间没有逗号、分号之类的。
1.4从timestamp中提取时间可以用to_char(time, 'hh24:mi:ss')
1.5sum(amout)不能放在内层select中,因为内层select没有分组,oracle如何知道怎么求和。
1.6having是对结果进行筛选,where是对原始数据筛选
1.7having后同样不能跟别名,如上,不能使用sumamount
1.8groupby的rollup,可以自动计算合计,比如group by rollup(duan),oracle自动多出一条上午和下午的营业额之和,不过rollup只能用一列,如果合计多列的话,用cube