楼主: xallan

如何写这个sql语句?

[复制链接]
论坛徽章:
63
版主7段
日期:2012-05-15 15:24:11itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-10 14:34:59马上加薪
日期:2015-01-08 15:39:192015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
11#
发表于 2003-2-22 13:49 | 只看该作者
收藏。

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
12#
发表于 2003-2-22 14:38 | 只看该作者

看不懂。

SQL> select deptno, dname, emps
2 from (
3 select d.deptno, d.dname, rtrim(e.ename ||', '||
4 lead(e.ename,1) over (partition by d.deptno
5 order by e.ename) ||', '||
6 lead(e.ename,2) over (partition by d.deptno
7 order by e.ename) ||', '||
8 lead(e.ename,3) over (partition by d.deptno
9 order by e.ename) ||', '||
10 lead(e.ename,4) over (partition by d.deptno
11 order by e.ename) ||', '||
12 lead(e.ename,5) over (partition by d.deptno
13 order by e.ename),', ') emps,
14 row_number () over (partition by d.deptno
15 order by e.ename) x
16 from emp e, dept d
17 where d.deptno = e.deptno
18 )
19 where x = 1
20 /

这是什么意思?

使用道具 举报

回复
论坛徽章:
9
授权会员
日期:2006-02-10 14:50:312008新春纪念徽章
日期:2008-02-13 12:43:032009日食纪念
日期:2009-07-22 09:30:002010新春纪念徽章
日期:2010-03-01 11:08:24ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:332014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11秀才
日期:2017-02-22 15:18:00
13#
发表于 2003-2-25 15:44 | 只看该作者

我的解法:(大家一起探讨)

先create function get_a2;
create or replace function get_a2( tmp_a1 number)
return varchar2
is
  Col_a2 varchar2(4000);
begin
  Col_a2:='';
  for cur in (select a2 from unite_a where a1=tmp_a1)
  loop
     Col_a2=Col_a2||cur.a2;   
  end loop;
  return Col_a2;
end get_a2;  

select distinct a1 ,get_a2(a1) from unite_a
1        ABC
2        EFG
3        KMN

使用道具 举报

回复
论坛徽章:
6
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-11-04 13:13:52会员2006贡献徽章
日期:2006-04-17 13:46:34在线时间
日期:2006-12-24 04:01:01会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
14#
发表于 2003-2-25 16:07 | 只看该作者
佩服佩服.
自己也没少看了书, 但怎么就是想不起来呢.
老外地解法是用到了分析函数, 详情参见 <<oracle专家高级编程>>

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2003-4-20 12:24 | 只看该作者

这个办法

最初由 xallan 发布
[B]不能不承认,还是老外厉害。

我在otn上也问了同样的问题。
很快有人说用plsql写个存储过程,后来我又问纯粹用sql行不行,有个牛人很快回答了:

Well if you have a thoretical maximum, which I would assume you would given the legibility of listing hundreds of employees in the way you describe then yes. But the SQL needs to use the LAG function for each employee, hence a hundred emps a hundred LAGs, so kind of bulky.

This example uses a max of 6, and would need more cut n pasting to do more than that.


SQL> select deptno, dname, emps
  2  from (
  3  select d.deptno, d.dname, rtrim(e.ename ||', '||
  4     lead(e.ename,1) over (partition by d.deptno
  5             order by e.ename) ||', '||
  6     lead(e.ename,2) over (partition by d.deptno
  7             order by e.ename) ||', '||
  8     lead(e.ename,3) over (partition by d.deptno
  9             order by e.ename) ||', '||
10     lead(e.ename,4) over (partition by d.deptno
11             order by e.ename) ||', '||
12     lead(e.ename,5) over (partition by d.deptno
13             order by e.ename),', ') emps,
14     row_number () over (partition by d.deptno
15             order by e.ename) x
16  from emp e, dept d
17  where d.deptno = e.deptno
18  )
19  where x = 1
20  /

DEPTNO DNAME       EMPS
------- ----------- ------------------------------------------
     10 ACCOUNTING  CLARK, KING, MILLER
     20 RESEARCH    ADAMS, FORD, JONES, ROONEY, SCOTT, SMITH
     30 SALES       ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD

--------------------
打算踏踏实实看看书. [/B]


无法应付一个部门人数超过5个人或者几百人不定的时候
除非你知道最多人数为N
然后采用 lead   N  来解决

所以 pl/sql 才是根本之道

使用道具 举报

回复
16#
发表于 2003-9-12 12:11 | 只看该作者
自定义函数也不行, 因为你必须将所有的查询参数PASS进去才能拿到你想要的行集. 并且如果我的查询参数是动态变化的(即有时很多, 有时一个也没有), 那应该怎样在自定义函数的SELECT语句中拿到你想要的行集呢?
我用的是SQL SERVER库, LEAD用法不一样. 我正在学习中......

使用道具 举报

回复
论坛徽章:
0
17#
发表于 2003-12-16 14:55 | 只看该作者
ding

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2004-5-28 17:56 | 只看该作者
老外,是很牛,但不太好理解,也太麻烦,我是赞成用函数

使用道具 举报

回复
论坛徽章:
52
SQL数据库编程大师
日期:2011-04-13 12:09:01奥运会纪念徽章:水球
日期:2012-10-08 09:35:51蛋疼蛋
日期:2012-11-19 10:28:53鲜花蛋
日期:2012-12-05 14:37:57紫蛋头
日期:2012-12-11 17:27:27紫蛋头
日期:2012-12-24 23:00:26兰博基尼
日期:2013-11-21 09:19:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
19#
发表于 2004-11-29 10:03 | 只看该作者
[PHP]
select deptno,list(Ename)  from emp group by deptno
  
      10    CLARK,KING,MILLER
      20    SMITH,FORD,ADAMS,SCOTT,JONES
      30    ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD



select object_type,list(to_char(created,'yyyy-mm-dd')) from user_objects
group by object_type


FUNCTION        2004-11-25
INDEX        2002-05-12,2002-05-12
TABLE        2002-05-12,2002-05-12,2002-05-12,2004-11-12,2004-10-28,2002-05-12
TYPE        2004-11-25
TYPE BODY        2004-11-25
[/PHP]

参考
http://www.itpub.net/293596.html

使用道具 举报

回复
论坛徽章:
4
ITPUB元老
日期:2007-04-19 13:22:13ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
20#
发表于 2005-1-26 18:07 | 只看该作者
經典

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表