• 几条sql语句


    1、行、列转换

    --行转列 
    create table 成绩(姓名 varchar(10),科目 varchar(10),分数 int) 
    insert into 成绩 values('张三','语文',74) 
    insert into 成绩 values('张三','数学',83) 
    insert into 成绩 values('张三','物理',93) 
    insert into 成绩 values('李四','语文',77) 
    insert into 成绩 values('李四','数学',84) 
    insert into 成绩 values('李四','物理',94)
    insert into 成绩 values('王五','语文',81) 
    insert into 成绩 values('王五','数学',86) 
    insert into 成绩 values('王五','物理',91)
    --方法1
    select
    姓名,
    max(case 科目 when '语文' then 分数 else 0 end) as 语文,
    max(case 科目 when '数学' then 分数 else 0 end) as 数学,
    max(case 科目 when '物理' then 分数 else 0 end) as 物理
    from 成绩 group by 姓名
    --方法2(sql20005)
    select*from 成绩 pivot(max(分数) for 科目 in (语文,数学,物理)) a
    
    --列转行 
    create table 成绩(姓名 varchar(10),语文 int,数学 int,物理 int) 
    insert into 成绩 values('张三',74,83,93)  
    insert into 成绩 values('李四',77,84,94)  
    insert into 成绩 values('王五',81,86,91)  
    --方法1
    select 姓名,'语文' as 科目,语文 as 分数 from 成绩
    union
    select 姓名,'数学' as 科目,数学 as 分数 from 成绩
    union
    select 姓名,'物理' as 科目,物理 as 分数 from 成绩
    --方法2
    select 姓名,科目,分数 from 成绩 unpivot(分数 for 科目 in(语文,数学,物理)) t
    View Code

    2、分组排序

    --(用上行转列的表,各科按成绩排名,sql2005)
    select row_number() over(partition by 科目 order by 分数 desc) as 排名,姓名,科目,分数 from 成绩

    3、递归查询
    树形结构查找某个节点的上下级(sql2005)

    create table 部门(id int,名称 varchar(30),上级id int)
    go
    insert into 部门  values(1,'总部',0)
    insert into 部门  values(2,'研发部',1)
    insert into 部门  values(3,'软件部',2)
    insert into 部门  values(4,'企业软件部',3)
    insert into 部门  values(5,'CRM开发部',4)
     
    go
    with 下级部门 as
    (
        select*from 部门 where id=2
        union all
        select t1.* from 部门 t1 inner join 下级部门 t2 on t1.上级id=t2.id
    )
    select*from 下级部门
    go
    with 上级部门 as
    (
        select*from 部门 where id=4
        union all
        select t1.* from 部门 t1 inner join 上级部门 t2 on t1.id=t2.上级id
    )
    select*from 上级部门
    View Code

    4、多行拼接到一列
    (在用户以及用户所属角色的列表)

    create table 用户 (id int,名称 varchar(30))
    go
    create table 角色(id int,名称 varchar(30))
    go
    create table 用户_角色(用户id int,角色id int)
    go
    insert into 用户 values(1,'A')
    insert into 用户 values(2,'B')
    insert into 角色 values(1,'管理员')
    insert into 角色 values(2,'主管')
    insert into 用户_角色 values(1,1)
    insert into 用户_角色 values(1,2)
    insert into 用户_角色 values(2,2)
    go
    
    select *,
    stuff((select ','+名称 from 角色 a left join 用户_角色 b on a.id=b.角色id where b.用户id=u.id for xml path('')),1,1,'') as 角色
    from 用户 u
  • 相关阅读:
    Ubuntu麒麟社区的行为准则(Code of Conduct)
    Delphi 用WinInet 单元实现 POST提交数据
    linux下IPTABLES配置详解
    modelsim 安装后运行,出现fatal License Error
    设计Web应用程序时要注意可伸缩性
    计算机端口详细介绍(整理版)
    Eclipse程序员要掌握的常用快捷键
    程序员怎么才能提高代码编写速度?
    做有中国特色的程序员
    网站建设中关于并发连接数的解释
  • 原文地址:https://www.cnblogs.com/zengyy/p/3358222.html
Copyright © 2020-2023  润新知