[每日一题] OCP1z0-047 :2013-07-22 group by 子句
这道题就是考where group by having的顺序。。。
答案A不正确:where应该放在group by前面
答案B不正确:having子句是用多行函数(sum,avg,max,min,count)等做为条件
答案C不正确:where应该放在group by前面
参考如下:(其实having 也可以放在group by前面)
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
答案:D
**********************************************************
一、group by分组注意:
drop table t;
drop table t1;
create table t(id number,dt date);
create table t1(id number,dt date);
insert into t values(1,sysdate);
insert into t1 values(1,sysdate+1);
insert into t1 values(1,sysdate+2);
commit;
--表中不正确
select t.id,max(t1.dt) mdt
from t,t1 where t.id=t1.id;
--dual结合select 常量,始终返回一行,不管dual有多少行,所以正确
--在一般表里会出错,这个世界的规则有普通规则和特殊规则,如果都去遵守普遍规则,那么将会世界太平,特殊规则不用刻意去追求和遵循
with t as
(select 1 id,sysdate dt from dual),
t1 as
(select 1 id,sysdate+1 dt from dual union all
select 1,sysdate+2 from dual)
select t.id,max(t1.dt) mdt
from t,t1 where t.id=t1.id;
--t1.id是多行,不行
with t as
(select 1 id,sysdate dt from dual),
t1 as
(select 1 id,sysdate+1 dt from dual
UNION ALL
select 1,sysdate+2 from dual)
select t1.id,max(t1.dt) mdt
from t,t1 where t.id=t1.id;
--让tm来源于表,照样出错,和dual构造都有关系
with tm as
(select 1 id,sysdate dt from t),
t1 as
(select 1 id,sysdate+1 dt from dual union all
select 1,sysdate+2 from dual)
select t1.id,max(t1.dt) mdt
from tm,t1 where tm.id=t1.id;
select dummy from dual;
--错误
select dummy from dual having count(*)=1;
--错误
with t as
(select dummy from dual)
select dummy from t having count(*)=1;
--用dummy就算取别名也出错,dummy列里不是常量??因为dummy允许多行
with t as
(select dummy x from dual)
select x from t having count(*)=1;
--正确,不用dummy,因为select 常量 from dual;不管dual有多少行,始终返回一行
with t as
(select 'X' x from dual)
select x from t having count(*)=1;
select * from dual;
--给dual插入一条数据
insert into sys.dual values('Y');
----------------------------------------------------神奇的dual------------------------------------------------------------------
SQL> select dummy from dual;
DUMMY
-----
X
Y
SQL> select 'X' x from dual;
X
-
X
SQL> drop table m;
Table dropped
SQL> create table m(d varchar2(10));
Table created
SQL> insert into m values('a');
1 row inserted
SQL> insert into m values('b');
1 row inserted
SQL> select 'X' x from m;
X
-
X
X
二、having写在group by前后都一样
drop table t;
create table t(id number,name varchar2(10),sal number);
insert into t values(1,'a',2000);
insert into t values(1,'b',3000);
insert into t values(2,'c',1000);
insert into t values(2,'x',2000);
insert into t values(3,'d',5000);
insert into t values(4,'e',4000);
commit;
delete from t where id=1;
--下面的结果是一样的,但是最好用第2种,可读性强
select id,max(sal),count(*) from t having count(*)>1 group by id;
select id,max(sal),count(*) from t group by id having count(*)>1;
俩个sql有 什么区别?
1. select job,sum(sal) from emp t group by job having sum(sal) > 4200
2. select job,sum(sal) from emp t having sum(sal) > 4200 group by job
查询结果是一样的,具体这俩句有区别吗??
没有区别,oracle having可以放在前后,常规写法第1种
三、理解分组
http://www.itpub.net/thread-1042899-1-1.html
如何实现比较复杂的分组、小计与合计
--测试代码
create table t_dist
(
TYPE_CD NUMBER,
BUYER_ID VARCHAR2(50),
ORDER_DT DATE,
SO_ID VARCHAR2(50) not null,
STOCK_ID VARCHAR2(50) not null,
UNIT_PRICE NUMBER,
DISCOUNT NUMBER,
QTY NUMBER
);
truncate table t_dist;
insert into t_dist values(1,'CN1001',to_date('2008-04-01','yyyy-mm-dd'),'S9001','29110311',50,10,8);
insert into t_dist values(1,'CN1001',to_date('2008-04-02','yyyy-mm-dd'),'S9002','29110312',60,20,2);
insert into t_dist values(1,'CN1001',to_date('2008-04-03','yyyy-mm-dd'),'S9003','29110313',70,15,3);
insert into t_dist values(2,'CN1001',to_date('2008-04-04','yyyy-mm-dd'),'S9004','29110312',60,15,5);
insert into t_dist values(2,'CN1001',to_date('2008-04-05','yyyy-mm-dd'),'S9005','29110311',70,10,6);
insert into t_dist values(3,'CN1001',to_date('2008-04-06','yyyy-mm-dd'),'S9006','29110313',55,20,4);
insert into t_dist values(3,'CN1001',to_date('2008-04-06','yyyy-mm-dd'),'S9007','29110311',40,10,3);
insert into t_dist values(3,'CN1001',to_date('2008-04-07','yyyy-mm-dd'),'S9008','29110312',50,50,5);
insert into t_dist values(3,'CN1001',to_date('2008-04-07','yyyy-mm-dd'),'S9009','29110313',80,10,2);
insert into t_dist values(1,'CN1001',to_date('2008-04-08','yyyy-mm-dd'),'S9010','29110311',65,10,1);
commit;
请问:如何实现如下结果,谢谢!
即计算按stock_id,type_cd,distount分组,计算每个产品的销售额(qty*unit_price)及销售百分比,并有小计
STOCK_ID TYPE_CD DISCOUNT AVG_PRICE SUM_TOT PCT
-------------------------------------------------------------------------------------------------
29110311 1 10 57.50 465 46.27%
29110311 2 10 70.00 420 41.79%
29110311 3 10 40.00 120 11.94%
小计 55.83 1005 100.00%
29110312 1 20 60.00 120 17.91%
29110312 2 15 60.00 300 44.78%
29110312 3 50 50.00 250 37.31%
小计 56.67 670 100.00%
29110313 1 15 70.00 210 35.59%
29110313 3 10 80.00 160 27.12%
29110313 3 20 55.00 220 37.29%
小计 68.33 590 100.00%
哦, 我明白了PCT的意思了, 以后要把问题描述的清楚点![有没有奖励啊? ]
具体如下:
SQL> select case when grouping_id(type_cd,discount) = 3 then '小计' else stock_id end stock_id,
2 type_cd,discount,avg(unit_price ) AVG_PRICE,
3 sum(qty*unit_price) SUM_TOT,
4 RATIO_TO_REPORT(sum(qty*unit_price )) over(partition by stock_id)*2 PCT
5 from t_dist
6 group by stock_id,rollup((type_cd,discount));
STOCK_ID TYPE_CD DISCOUNT AVG_PRICE SUM_TOT PCT
-------------------------------------------------- ---------- ---------- ---------- ---------- ----------
29110311 1 10 57.5 465 0.46268656
29110311 2 10 70 420 0.41791044
29110311 3 10 40 120 0.11940298
小计 56.25 1005 1
29110312 1 20 60 120 0.17910447
29110312 2 15 60 300 0.44776119
29110312 3 50 50 250 0.37313432
小计 56.6666666 670 1
29110313 1 15 70 210 0.35593220
29110313 3 10 80 160 0.27118644
29110313 3 20 55 220 0.37288135
小计 68.3333333 590 1
12 rows selected
QUOTE:
--------------------------------------------------------------------------------
原帖由 dingjun123 于 2011-2-23 10:13 发表
理解分组的概念
sum(sum(........之后相当于什么样的分组,后面又来个sum(.............
当然报错了
--------------------------------------------------------------------------------
还是不理解 ,
暂不看sum,这里的 分子。分母是一样的啊。只是sum了分母,还是sum了分子;
相当于 sum(sum(a))/sum(a) 与 sum(a)/sum(sum(a)) ,后面的行的通,前面的怎么可能行不通啊
理解这个
with t as
(select mod(level,2) id from dual connect by level<10 )
select id,sum(id) from t
group by id;
with t as
(select mod(level,2) id from dual connect by level<10 )
select-- id,
sum(sum(id)) from t
group by id;
第2句为什么不能有id,因为sum(sum,外面的sum相当于全量分组了,相当于
with t as
(select mod(level,2) id from dual connect by level<10 )
select sum(x) from (
select id,
sum(id) x from t
group by id
);
那么当然不能有非汇总列在select里显示啊
一针见血啊。高~,很耐心的指导啊
还有个疑问
select
sum(sum(QTY )) over (partition by stock_Id) PCT1 ,
sum(sum(QTY )) over (partition by stock_Id,grouping(type_cd)) PCT2
from t_dist
group by rollup(stock_id,(type_cd,DISCOUNT))
PCT1,PCT2有何区别?我实在是想不懂了。
等价于这个
select sum(x) over (partition by stock_Id) PCT1,
sum(x) over(partition by stock_Id,gp) PCT2
from (
select
sum(QTY ) x,stock_Id,grouping(type_cd) gp
from t_dist
group by rollup(stock_id,(type_cd,DISCOUNT))
);
看红色部分就知道第3个加了grouping的值,那么分区(分组)是不同的,所以两个结果不同
[每日一题] OCP1z0-047 :2013-07-22 group by 子句的更多相关文章
- JAVA面试题——JAVA编程题1(2015.07.22——湛耀)
实现代码很简单: package com.xiaozan.shopping; import java.util.Arrays; public class ShoppingCart { ...
- <2013 07 22> 游历西欧
从本月11号开始到昨天,10天时间,和其他六位同学畅游了西欧,路经慕尼黑-巴塞罗马-尼斯-马赛-巴黎-阿姆斯特丹,最后回到慕尼黑,每个地方都待了两天,参观了主要的景点和建筑,见识了本地文化与饮食. 令 ...
- JAVA面试题——JAVA编程题1(2015.07.22)
实现代码很简单: package com.xiaozan.shopping; import java.util.Arrays; public class ShoppingCart { ...
- CISP/CISA 每日一题 22
CISSP 每日一题(答)What should be done to verify patcheshave been applied? Auditpatches, or use a vulnerab ...
- 老男孩IT教育-每日一题汇总
老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...
- 【剑指Offer】简单部分每日五题 - Day 1
今天开始更新leetcode上<剑指Offer>的题解,先从简单难度开始.预计按下列顺序更新: 简单难度:每日5题 中等难度:每日3题 困难难度:每日1题 17 - 打印从1到最大的n位数 ...
- 【JavaScript】【dp】Leetcode每日一题-解码方法
[JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...
- 【python】Leetcode每日一题-逆波兰表达式求值
[python]Leetcode每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170105
20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
随机推荐
- Asp.Net MVC4 + Oracle + EasyUI + Bootstrap
Asp.Net MVC4 + Oracle + EasyUI + Bootstrap --操作数据和验证 本文链接:http://www.cnblogs.com/likeli/p/4234238.ht ...
- 一些javascript常用方法
1.输入一个正整数n,从1累加到n,返回结果.(如果输入为非正整数,如:小数.0.负数.NaN或其它非数字则返回false) function f(n){ return ~~+n == n & ...
- outlook 会议室
原文:outlook 会议室 但是,里面的方法只能用于发送普通电子邮件.如果要发起会议之类的特殊邮件的话,可以C#调用Outlook API,自身的API. 创建项目后,为它添加.NET引用:“Mic ...
- The Native POSIX Thread Library for Linux - 设计文档
nptl-design
- javascript 正则介绍
1.正则直接量字符 \o NUL字符(\u000)\t 制表符\n 换行符(\u000A)\v 垂直制表符\f 换页符\xnn 由16进制nn指定的拉丁字符\uXXXX 由16进制XXXX指定的unc ...
- iTextSharp生成pdf文档案例
1.using iTextSharp.text;using iTextSharp.text.pdf; 2.设置页面大小 iTextSharp.text.Rectangle pageSize = new ...
- iOS生命周期 & 通知中心
笔记内容 学习笔记-段玉磊 Stanford course View Controller Lifecycle 这篇文是我记载Developing iOS 7 Apps公开课 第5课的笔记 UITex ...
- 历年noip复赛试题整合
早晨打算把历年的试题都过一遍,整理一下大概会往哪个方向考,考什么,不说太多,开始吧 2013: Day1: T1 转圈游戏 : 快速幂(关键在于要会打 快速幂) 思路:因为每次都进m位,相当于每次x加 ...
- AHOI1997彩旗飘飘 VIJOS1097合并果子(noip2007)
AHOI彩旗飘飘 这是一题类似于排列组合的题目吧...递推状态 数组f[100][100][100][2];表示红旗数目,黄旗数目,颜色改变的次数,末尾的旗的颜色(0为黄,1为红) 之后就是如何写递推 ...
- 企业架构研究总结(37)——TOGAF企业连续体和工具之架构资源库及架构工具的选择
3. 架构资源库 在一个企业,尤其是在一个大型企业中,建设一个成熟的架构往往会产生大量的工作产品.为了很好地管理和利用这些工作产品,企业需要制定一个正式的针对不同类型架构资产的分类方法,并且还需要专门 ...