`
lgx2351
  • 浏览: 175317 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

关于分组常会用到的sql

 
阅读更多

1、group by 后想把列合并起来,可以用WMSYS.WM_CONCAT(FIELD_NAME),这在实际写sql中很常用。

2、我们一般在写sql里用group by来分组,有时候要求得到group by的数目时,常常会加上count。这时候如果除了分组的字段,我还要想select其它的字段的话,会报不是分组的字段的错误。而且,我们常常有通过select 出来的内容是根据count(*)排序后的内容,这时候可以用:

OVER(partition by FIELD_NAME1 order by FIELD_NAME2)来进行,且可以根据分组的count的数量进行排序,如:

select *
  from (select tunnel_name 隧道名称,CONTENT 事件内容,STYLE 事件类型,AFF_LEVEL 事件等级,location 位置,PLACE_MILE 地点桩号,BEGIN_TIME 发生时间,CENTER_MILE 隧道中心桩号,TUNNEL_LEN 隧道长度,ROAD_LINE_NAME 所属路线,
                 count(*) OVER(partition by tunnel_name order by tunnel_name) CNT
          from epub.tunnel_rank_temp)
 order by CNTdesc

3、网上摘录的资料:(原文:http://hi.baidu.com/jinliyixi/blog/item/41f180c75cc0fca48326ace4.html)

wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换

 

构建测试表:

Sql代码
create table TABLE1   
(   
   ID   INTEGER,   
  NAME VARCHAR2(10)   
)   
  
create table TABLE2   
(   
   ID   INTEGER,   
   ROLE VARCHAR2(10)   
)   
  
insert into TABLE1 (ID, NAME) values (1, '张三');   
insert into TABLE1 (ID, NAME) values (2, '李四');   
commit;   
  
insert into TABLE2 (ID, ROLE) values (1, '查询');   
insert into TABLE2 (ID, ROLE) values (1, '分析');   
insert into TABLE2 (ID, ROLE) values (1, '决策');   
insert into TABLE2 (ID, ROLE) values (2, '查询');   
commit;  

create table TABLE1
(
ID   INTEGER,
NAME VARCHAR2(10)
)
create table TABLE2
(
ID   INTEGER,
ROLE VARCHAR2(10)
)
insert into TABLE1 (ID, NAME) values (1, '张三');
insert into TABLE1 (ID, NAME) values (2, '李四');
commit;
insert into TABLE2 (ID, ROLE) values (1, '查询');
insert into TABLE2 (ID, ROLE) values (1, '分析');
insert into TABLE2 (ID, ROLE) values (1, '决策');
insert into TABLE2 (ID, ROLE) values (2, '查询');
commit;

要求输出结果:

Sql代码
ID  NAME     ROLE   
1     张三 查询,分析,决策   
2     李四 查询  

ID NAME ROLE
1  张三 查询,分析,决策
2  李四 查询


方法一、使用wmsys.wm_concat

Sql代码
select table1.*,wmsys.wm_concat(role) from table1,table2 where table1.id=table2.id   
group by table1.id,table1.name  

select table1.*,wmsys.wm_concat(role) from table1,table2 where table1.id=table2.id
group by table1.id,table1.name

方法二、使用sys_connect_by_path

Sql代码
select id, name, ltrim(max(sys_connect_by_path(role, ',')), ',') from   
(select row_number() over(partition by table1.id order by name) rn,table1.*, role from table1, table2  where table1.id =   
  
table2.id)   
start with rn = 1   
connect by prior rn = rn - 1 and prior id = id   
group by id, name  
order by id   
         

select id, name, ltrim(max(sys_connect_by_path(role, ',')), ',') from
(select row_number() over(partition by table1.id order by name) rn,table1.*, role from table1, table2  where table1.id =
table2.id)
start with rn = 1
connect by prior rn = rn - 1 and prior id = id
group by id, name
order by id

方法三、使用自定义函数

Sql代码
create or replace function my_concat(mid in integer) return varchar2       --记住:参数和返回值里的数据类型都不用定义长度   
is  
result varchar2(4000);    --定义变量,记住Oracle中定义变量不需要   
begin  
       for temp_cursor in (select role from table2 where id=mid) loop     --此处在游标FOR循环中使用查询   
            result :=result || temp_cursor.role || ',';    --Oracle中字符连接使用||,而sql server中用+          
       end loop;   
        result := rtrim(result,',');  --去掉最后一个空格,还有Oracle中的赋值前面没有set   
       return result;   
end;   
  
select table1.*,my_concat(table1.id) from table1,table2 where table1.id=table2.id   
group by table1.id,table1.name  
order by table1.id

分享到:
评论

相关推荐

    40个工作中最常会用到的思维模型.pdf

    40个工作中最常会用到的思维模型.pdf

    工作中经常常会用到的java工具类

    Java工具类是编程中不可或缺的部分,它们提供了许多实用的功能,帮助开发者提高代码的复用性和效率。以下是对这些工具类的详细说明: 1. **StringUtil.java**:字符串处理工具类,通常包含各种对字符串进行操作的...

    原创SQL SERVER 解锁工具

    SQL SERVER 有资源紧张时,常会有死锁发生,用此工具可进行解锁操作。

    SQL2005事件查看器

    在开发数据库应用的时候,我们常会使用 SQL Server Profiler 工具帮我们监控到底应用程序对数据库下了什么 SQL 指令,但是在 SQL Server 2005 Express 版本中并没有提供 SQL Server Profiler 工具,只有 SQL Server ...

    sqljdbc sqljava驱动

    SQLJDBC和SQLJava驱动是Java应用程序连接到SQL Server数据库的关键组件。它们允许开发者通过Java编程语言执行SQL查询,管理数据库事务,以及进行其他数据库操作。以下是对这些知识点的详细解释: 1. SQLJDBC驱动:...

    在MySQL concat里面使用多个单引号,三引号的问题

    在动态拼接字符串时,我们常会用到字符拼接,我对拼接的引号不理解,如: 1、”’+ id +”’ 为什么是3个引号,为什么左边一个加号右边一个加号(能不能着重帮我解释下这个,详细点) SQL code sum(case Leave when...

    SQL另类导入数据方法.pdf

    在数据导入的过程中,数据管理人员常会使用SQL Server自带的导入数据向导来执行操作。这个向导指导用户完成一系列步骤,包括选择数据源、设置目标数据库、指定复制的表格或执行的查询,以及最终的选择源数据表格。这...

    SQL Server开发人员应聘常被问的问题妙解汇总

    SQL Server 开发人员在应聘时常常会被问及一系列专业问题,这些问题旨在评估他们的技能水平和对SQL Server的理解程度。以下是一些常见的面试问题及其详细解答: 1. **什么是数据库对象?** SQL Server中的数据库...

    建筑和工程行业研究:国常会针对性聚焦民企融资,优质民企再获支持.pdf

    建筑和工程行业研究:国常会针对性聚焦民企融资,优质民企再获支持.pdf

    SQL Server数据挖掘技术应用研究.pdf

    在数据表的设计中,常会使用到自增型字段(IDENTITY),以保证每条记录的唯一性。例如,在本研究中,建有adult和adult_test两个数据表,分别用于保存训练数据和测试数据。其中的id字段作为表的主键,保证了数据的不...

    数据库面试题SQL+ORACLE

    面试中也常会问到锁的概念,包括共享锁和互斥锁,以及两段锁协议来确保事务的正确执行。 死锁是事务处理中必须解决的问题,面试中可能会要求解释死锁的原因并讨论解决死锁的策略。存储过程是存储在数据库中的一组预...

    视频监控系统技术规范-通用部分

    视频监控系统技术规范-通用部分

    portscan软件

    网络安全实验中常会用到 用于被动端口扫描 无病毒

    .NET开发者常会忽略的几个错误

    ### .NET开发者常会忽略的几个错误 在.NET框架下的应用程序开发过程中,开发者们往往会遇到各种各样的问题,其中有些是由于对某些细节不够重视所导致的。本文将重点介绍几种.NET开发者容易忽视但又非常重要的错误,...

    android docs网页版的开发帮助文档----4/5部份

    学习开发中常会用到google网页版的开发文档(此帮助文档不是chm类型的哦!),如果你的sdk目录下没有docs文件夹可以考虑下载哦!(下载下来点开index.html就可以查看到了,可能有点卡,建议使用火狐浏览器,打开后按...

    数字频率计的multisim仿真

    用multisim仿真数字频率计,高等教育课程设计中常会用到!

    MSDE管理小工具.rar

    在开发数据库应用的时候,我们常会使用 SQL Server Profiler 工具帮我们监控到底应用程序对数据库下了什么 SQL 指令,但是在 SQL Server 2005 Express 版本中并没有提供 SQL Server Profiler 工具,只有 SQL Server ...

    自定报表设计及其常见问题解答

    书里面有一些常会用到开发资源,比较全面。适合各位新手学习

Global site tag (gtag.js) - Google Analytics