免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3260 | 回复: 10
打印 上一主题 下一主题

在Oracle中能够实现这样的查询吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-05 21:34 |只看该作者 |倒序浏览
原始表两个
emp表:列名:empno,ename,job,mgr(经理编号),hirdate,sal,comm(奖金),deptno
dept表:列名:deptno,dname,loc(工作地点)
用oracle实现!

     查询每个部门的部门号,部门名,员工数以及该部门的平均工资加上工作在该部门的员工的员工名,工资与职位。
     要求显示结果如下:
DEPTNO DNAME       EMPLOYEES AVG_SAL      ENAME  SAL    JOB
------ ----------- --------- -------             ------- ---- --------
   10 ACCOUNTING          3        2916.67       CLARK   2450 MANAGER
                                                              KING    5000 PRESIDENT
                                                              MILLER  1300 CLERK

   20 RESEARCH              5        2175.00       ADAMS   1100 CLERK
                                                              FORD    3000 ANALYST
                                                              JONES   2975 MANAGER
                                                              SCOTT   3000 ANALYST
                                                              SMITH    800 CLERK

   30 SALES                   6        1566.67       ALLEN   1600 SALESMAN
                                                              BLAKE   2850 MANAGER
                                                              JAMES    950 CLERK
                                                              MARTIN  1250 SALESMAN
                                                              TURNER  1500 SALESMAN
                                                              WARD    1250 SALESMAN
   40 OPERATIONS          0       No average

论坛徽章:
0
2 [报告]
发表于 2007-04-05 23:22 |只看该作者
根据俺的知识是不可能!前后的行不一致是不行的!
要想出类似的结果,先建个视图再连接查询吧

论坛徽章:
0
3 [报告]
发表于 2007-04-06 08:15 |只看该作者
这个可能不行
EMPLOYEES,AVG_SAL这两列是要group by的,ENAME,SAL,JOB以是不需要GROUP BY的

[ 本帖最后由 doni 于 2007-4-6 08:22 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-04-06 08:27 |只看该作者
突然想起,或许这样可以,就是有点怪
  1. break on deptno on dname on employees on sal skip
  2. select .......
  3.   from (
  4.     select d.deptno,d.dname,count(e.empno) employees,decode(count(e.empno),0,"No average",avg(e.sal)) sal
  5.       from dept d, emp e
  6.      where d.deptno = e.deptno
  7.      group by d.deptno,d.dname) a, emp b
  8. where a.deptno = b.deptno;
复制代码

论坛徽章:
0
5 [报告]
发表于 2007-04-06 09:27 |只看该作者
有點接近﹐供樓主參考。
select n.depno,n.depname,n.sal_avg,n.emp_cnt,k.empname,k.salary,k.job from
(select m.depno,m.depname,round(avg(m.salary),0) sal_avg,count(*) emp_cnt from  
   (select d.deptno depno,d.dname depname,e.ename empname,e.mgr mgr,
      e.sal salary,e.job job from dept d,emp e where d.deptno(+)=e.deptno) m group by m.depno,m.depname)n,
(select d.deptno depno,d.dname depname,e.ename empname,e.mgr mgr,e.sal salary,e.job job
    from dept d,emp e where d.deptno(+)=e.deptno) k
where n.depno(+)=k.depno

论坛徽章:
0
6 [报告]
发表于 2007-04-06 10:13 |只看该作者
原帖由 doni 于 2007-4-6 08:27 发表
突然想起,或许这样可以,就是有点怪
[code]break on deptno on dname on employees on sal skip
select .......
  from (
    select d.deptno,d.dname,count(e.empno) employees,decode(count(e.empno),0,&qu ...


正解, 使用了sqlplus特有的一些功能

论坛徽章:
0
7 [报告]
发表于 2007-04-06 10:35 |只看该作者
我用hr模式下的表作了一下测试:
sql语句如下:

  1. col deptname for a20
  2. set linesize 200
  3. set pagesize 200
  4. break on deptid on deptname on employees on avg_sal skip 1
  5. select deptid, deptname,employees, avg_sal, employee_id, first_name,salary from
  6. (select dept.department_id deptid, dept.department_name deptname, count(employee_id) employees, avg(salary) avg_sal
  7. from hr.employees emp, hr.departments dept
  8. where emp.department_id = dept.department_id
  9. group by dept.department_id, dept.department_name) taba, hr.employees tabb
  10. where taba.deptid = tabb.department_id order by deptid,deptname,employees,avg_sal,employee_id;

复制代码

测试结果如下

  1. SQL*Plus: Release 9.2.0.6.0 - Production on Fri Apr 6 10:18:30 2007

  2. Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

  3. Enter user-name: / as sysdba

  4. Connected to:
  5. Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
  6. With the Partitioning, OLAP and Oracle Data Mining options
  7. JServer Release 9.2.0.6.0 - Production

  8. SQL> col deptname for a20
  9. set linesize 200
  10. set pagesize 200
  11. break on deptid on deptname on employees on avg_sal skip 1
  12. select deptid, deptname,employees, avg_sal, employee_id, first_name,salary from
  13. (select dept.department_id deptid, dept.department_name deptname, count(employee_id) employees, avg(salary) avg_sal
  14. from hr.employees emp, hr.departments dept
  15. where emp.department_id = dept.department_id
  16. group by dept.department_id, dept.department_name) taba, hr.employees tabb
  17. where taba.deptid = tabb.department_id order by deptid,deptname,employees,avg_sal,employee_id;SQL> SQL> SQL> SQL>   2    3    4    5    6  

  18.     DEPTID DEPTNAME              EMPLOYEES    AVG_SAL EMPLOYEE_ID FIRST_NAME                                   SALARY
  19. ---------- -------------------- ---------- ---------- ----------- ---------------------------------------- ----------
  20.         10 Administration                1       4400         200 Jennifer                                       4400

  21.         20 Marketing                     2       9500         201 Michael                                       13000
  22.                                                               202 Pat                                            6000

  23.         30 Purchasing                    6       4150         114 Den                                           11000
  24.                                                               115 Alexander                                      3100
  25.                                                               116 Shelli                                         2900
  26.                                                               117 Sigal                                          2800
  27.                                                               118 Guy                                            2600
  28.                                                               119 Karen                                          2500

  29.         40 Human Resources               1       6500         203 Susan                                          6500

  30.         50 Shipping                     45 3475.55556         120 Matthew                                        8000
  31.                                                               121 Adam                                           8200
  32.                                                               122 Payam                                          7900
  33.                                                               123 Shanta                                         6500
  34.                                                               124 Kevin                                          5800
  35.                                                               125 Julia                                          3200
  36.                                                               126 Irene                                          2700
  37.                                                               127 James                                          2400
  38.                                                               128 Steven                                         2200
  39.                                                               129 Laura                                          3300
  40.                                                               130 Mozhe                                          2800
  41.                                                               131 James                                          2500
  42.                                                               132 TJ                                             2100
  43.                                                               133 Jason                                          3300
  44.                                                               134 Michael                                        2900
  45.                                                               135 Ki                                             2400
  46.                                                               136 Hazel                                          2200
  47.                                                               137 Renske                                         3600
  48.                                                               138 Stephen                                        3200
  49.                                                               139 John                                           2700
  50.                                                               140 Joshua                                         2500
  51.                                                               141 Trenna                                         3500
  52.                                                               142 Curtis                                         3100
  53.                                                               143 Randall                                        2600
  54.                                                               144 Peter                                          2500
  55.                                                               180 Winston                                        3200
  56.                                                               181 Jean                                           3100
  57.                                                               182 Martha                                         2500
  58.                                                               183 Girard                                         2800
  59.                                                               184 Nandita                                        4200
  60.                                                               185 Alexis                                         4100
  61.                                                               186 Julia                                          3400
  62.                                                               187 Anthony                                        3000
  63.                                                               188 Kelly                                          3800
  64.                                                               189 Jennifer                                       3600
  65.                                                               190 Timothy                                        2900
  66.                                                               191 Randall                                        2500
  67.                                                               192 Sarah                                          4000
  68.                                                               193 Britney                                        3900
  69.                                                               194 Samuel                                         3200
  70.                                                               195 Vance                                          2800
  71.                                                               196 Alana                                          3100
  72.                                                               197 Kevin                                          3000
  73.                                                               198 Donald                                         2600
  74.                                                               199 Douglas                                        2600

  75.         60 IT                            5       5760         103 Alexander                                      9000
  76.                                                               104 Bruce                                          6000
  77.                                                               105 David                                          4800
  78.                                                               106 Valli                                          4800
  79.                                                               107 Diana                                          4200

  80.         70 Public Relations              1      10000         204 Hermann                                       10000

  81.         80 Sales                        34 8955.88235         145 John                                          14000
  82.                                                               146 Karen                                         13500
  83.                                                               147 Alberto                                       12000
  84.                                                               148 Gerald                                        11000
  85.                                                               149 Eleni                                         10500
  86.                                                               150 Peter                                         10000
  87.                                                               151 David                                          9500
  88.                                                               152 Peter                                          9000
  89.                                                               153 Christopher                                    8000
  90.                                                               154 Nanette                                        7500
  91.                                                               155 Oliver                                         7000
  92.                                                               156 Janette                                       10000
  93.                                                               157 Patrick                                        9500
  94.                                                               158 Allan                                          9000
  95.                                                               159 Lindsey                                        8000
  96.                                                               160 Louise                                         7500
  97.                                                               161 Sarath                                         7000
  98.                                                               162 Clara                                         10500
  99.                                                               163 Danielle                                       9500
  100.                                                               164 Mattea                                         7200
  101.                                                               165 David                                          6800
  102.                                                               166 Sundar                                         6400
  103.                                                               167 Amit                                           6200
  104.                                                               168 Lisa                                          11500
  105.                                                               169 Harrison                                      10000
  106.                                                               170 Tayler                                         9600
  107.                                                               171 William                                        7400
  108.                                                               172 Elizabeth                                      7300
  109.                                                               173 Sundita                                        6100
  110.                                                               174 Ellen                                         11000
  111.                                                               175 Alyssa                                         8800
  112.                                                               176 Jonathon                                       8600
  113.                                                               177 Jack                                           8400
  114.                                                               179 Charles                                        6200

  115.         90 Executive                     3 19333.3333         100 Steven                                        24000
  116.                                                               101 Neena                                         17000
  117.                                                               102 Lex                                           17000

  118.        100 Finance                       6       8600         108 Nancy                                         12000
  119.                                                               109 Daniel                                         9000
  120.                                                               110 John                                           8200
  121.                                                               111 Ismael                                         7700
  122.                                                               112 Jose Manuel                                    7800
  123.                                                               113 Luis                                           6900

  124.        110 Accounting                    2      10150         205 Shelley                                       12000
  125.                                                               206 William                                        8300


  126. 106 rows selected.
复制代码

论坛徽章:
0
8 [报告]
发表于 2007-04-07 00:03 |只看该作者
谢blue-stone,我按照你的思路试验出来了,不过不明白下面这句话的含义:
break on deptno on dname on employees on avg_sal skip 1
能帮我解释一下吗,多谢!

论坛徽章:
0
9 [报告]
发表于 2007-04-07 11:47 |只看该作者
break on deptno on dname on employees on avg_sal
表示列  deptno, dname,employees,avg_sal相同的时候只显示第一行,下面显示为空白。
skip 1表示deptno, dname,employees,avg_sal相同的行组成一组,组和组之间有一个空白行。
这个语句设置了sqlplus的显示格式。
具体用法可参考sqlplus reference.

论坛徽章:
0
10 [报告]
发表于 2007-04-08 16:23 |只看该作者
精辟!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP