问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何把sqlserver中的列转换成行,行转换成列,显示

发布网友 发布时间:2022-04-09 05:07

我来回答

2个回答

懂视网 时间:2022-04-09 09:28

创建行转列表及插入数据 create table tb_RowConvertToColumn ( username nvarchar(100) null, course nvarchar(100) null, score numeric(10,2) null ) insert into tb_RowConvertToColumn(username,course,score) values(‘张三‘,‘语文‘,82) insert into tb_RowConvertToColumn(username,course,score) values(‘张三‘,‘数学‘,85) insert into tb_RowConvertToColumn(username,course,score) values(‘张三‘,‘外语‘,90) insert into tb_RowConvertToColumn(username,course,score) values(‘李四‘,‘语文‘,86) insert into tb_RowConvertToColumn(username,course,score) values(‘李四‘,‘数学‘,82) insert into tb_RowConvertToColumn(username,course,score) values(‘李四‘,‘外语‘,92) insert into tb_RowConvertToColumn(username,course,score) values(‘王五‘,‘语文‘,82) insert into tb_RowConvertToColumn(username,course,score) values(‘王五‘,‘数学‘,94) insert into tb_RowConvertToColumn(username,course,score) values(‘王五‘,‘外语‘,82) --1.静态sql行转列,该sql指定了转换的列头 select username 姓名, MAX(case course when ‘语文‘ then score else 0 end) 语文, MAX(case course when ‘数学‘ then score else 0 end) 数学, MAX(case course when ‘外语‘ then score else 0 end) 外语 from tb_RowConvertToColumn group by username order by username /* 姓名 语文 数学 外语 李四 86.00 82.00 92.00 王五 82.00 94.00 82.00 张三 82.00 85.00 90.00 */ --2.静态sql行转列,该sql指定了转换的列头,该语句必须sqlserver2005及以上版本才能使用 select username 姓名,语文,数学,外语 from tb_RowConvertToColumn pivot(max(score) for course in(语文,数学,外语)) a /* 姓名 语文 数学 外语 李四 86.00 82.00 92.00 王五 82.00 94.00 82.00 张三 82.00 85.00 90.00 */ select * from tb_RowConvertToColumn pivot(max(score)for course in (语文,数学,外语)) a /* username 语文 数学 外语 李四 86.00 82.00 92.00 王五 82.00 94.00 82.00 张三 82.00 85.00 90.00 */ --3.动态sql行转列,自动生成转换的列 declare @sql nvarchar(2000) select distinct course into #tb_group from tb_RowConvertToColumn order by course desc--表头及排序 select @sql=ISNULL(@sql+‘,‘,‘‘)+‘MAX(case course when ‘‘‘+course+‘‘‘ then score else 0 end) [‘+course+‘]‘ from #tb_group set @sql=‘select username 姓名,‘+@sql +‘ from tb_RowConvertToColumn a‘ +‘ group by username‘ exec(@sql) drop table #tb_group /* 姓名 语文 外语 数学 李四 86.00 92.00 82.00 王五 82.00 82.00 94.00 张三 82.00 90.00 85.00 */ --4.动态sql行转列,自动生成转换的列,该语句必须sqlserver2005及以上版本才能使用 declare @sql nvarchar(2000) select @sql=ISNULL(@sql+‘,‘,‘‘)+course from tb_RowConvertToColumn group by course set @sql=‘select * from tb_RowConvertToColumn pivot (max(score) for course in (‘+@sql+‘)) a‘ exec(@sql) /* username 数学 外语 语文 李四 82.00 92.00 86.00 王五 94.00 82.00 82.00 张三 85.00 90.00 82.00 */
  • sqlserver列转行
  • --创建列转行表及插入数据
    create table tb_ColumnConvertToRow
    (
     [姓名] nvarchar(100) null,
     [语文] nvarchar(100) null,
     [数学] nvarchar(100) null,
     [外语] nvarchar(100) null
    )
    
    insert into tb_ColumnConvertToRow(姓名,语文,数学,外语) values(‘李四‘,82,92,86)
    insert into tb_ColumnConvertToRow(姓名,语文,数学,外语) values(‘王五‘,94,82,82)
    insert into tb_ColumnConvertToRow(姓名,语文,数学,外语) values(‘张三‘,85,90,82)
    
    --1.静态sql列转行,当列头较少时使用
    select * from 
    (
     select 姓名,课程=‘语文‘,分数=语文 from tb_ColumnConvertToRow
     union all
     select 姓名,课程=‘数学‘,分数=数学 from tb_ColumnConvertToRow
     union all 
     select 姓名,课程=‘外语‘,分数=外语 from tb_ColumnConvertToRow
    ) a
    /*
    姓名 课程 分数
    李四 语文 82
    王五 语文 94
    张三 语文 85
    李四 数学 92
    王五 数学 82
    张三 数学 90
    李四 外语 86
    王五 外语 82
    张三 外语 82
    */
    
    
    --2.静态sql列转行,当列头较少时使用,该语句必须sqlserver2005及以上版本才能使用
    select 姓名,课程,分数 from tb_ColumnConvertToRow unpivot(分数 for 课程 in (语文,数学,外语)) a
    /*
    姓名 课程 分数
    李四 语文 82
    李四 数学 92
    李四 外语 86
    王五 语文 94
    王五 数学 82
    王五 外语 82
    张三 语文 85
    张三 数学 90
    张三 外语 82
    */

     

    sqlserver行列转换

    标签:

    热心网友 时间:2022-04-09 06:36

    create database arron
    go
    use arron
    go

    -- createTable init Data
    create table students (
    name varchar(25),
    class varchar(25),
    grade int
    )
    insert into students values ('张三','语文',20)
    insert into students values ('张三','数学',90)
    insert into students values ('张三','英语',50)
    insert into students values ('李四','语文',81)
    insert into students values ('李四','数学',60)
    insert into students values ('李四','英语',90)

    -- solution1
    select * from students
    pivot(
    max(grade)
    FOR [class] IN ([语文],[数学],[英语])
    ) AS pvt

    -- solution2 相当于自连接

    select A.Name,A.grade as 语文,B.grade as 数学,C.grade as 英语
    from students A,students B,students C
    where A.Name=B.Name and B.Name=C.Name
    and A.class='语文' and B.class='数学'
    and C.class='英语'

    -- solution3
    select name,
    max(case when s.class='语文' then s.grade end) as 语文,
    max(case when s.class='数学' then s.grade end) as 数学,
    max(case when s.class='英语' then s.grade end) as 英语
    from students s group by name

    --在有id 的情况下
    create table students2 (
    id int primary key identity(1,1),
    name varchar(25),
    class varchar(25),
    grade int
    )

    insert into students2 values ('张三','语文',20)
    insert into students2 values ('张三','数学',90)
    insert into students2 values ('张三','英语',50)
    insert into students2 values ('李四','语文',81)
    insert into students2 values ('李四','数学',60)
    insert into students2 values ('李四','英语',90)

    -- 原先的solution1(有问题)
    select * from students2
    pivot(
    max(grade)
    FOR [class] IN ([语文],[数学],[英语])
    ) AS pvt
    -- 原先的solution2 (ok)
    select A.Name,A.grade as 语文,B.grade as 数学,C.grade as 英语
    from students A,students2 B,students2 C
    where A.Name=B.Name and B.Name=C.Name
    and A.class='语文' and B.class='数学'
    and C.class='英语'
    -- 原先的solution3 (ok)
    select name,
    max(case when s.class='语文' then s.grade end) as 语文,
    max(case when s.class='数学' then s.grade end) as 数学,
    max(case when s.class='英语' then s.grade end) as 英语
    from students s group by name

    --unpivot 函数使用
    create table test1(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int)
    insert into test1 values(1,'a',1000,2000,4000,5000)
    insert into test1 values(2,'b',3000,3500,4200,5500)

    --实现的sql
    select * from test1

    select id ,[name],[ji],[xiaoshou] from test1
    unpivot
    (
    xiaoshou for ji in
    ([q1],[q2],[q3],[q4])
    )
    as f

    --- 以下的sql 可以替换上面的sql
    select id,[name],
    ji='Q1',
    xiaoshou=(select Q1 from test1 where id=a.id)
    from test1 as a
    union
    select id,[name],
    ji='Q2',
    xiaoshou=(select Q2 from test1 where id=a.id)
    from test1 as a
    union
    select id,[name],
    ji='Q3',
    xiaoshou=(select Q3 from test1 where id=a.id)
    from test1 as a
    union
    select id,[name],
    ji='Q4',
    xiaoshou=(select Q4 from test1 where id=a.id)
    from test1 as a
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    瑞安皇都大厦几个电梯 办签证和护照的具体步骤和一共的费用!我需要详细一点的答案. 办护照流程 办护照的流程是什么 哪位推荐几部韩剧啊!!要像豪杰春香,魔女幼熙这样的,剧情要感人,最好是... 小阴唇内应该是光滑的吗,阴道口痒为什么 阴道口有像草莓样正常吗 任氏族谱字辈:世秉忠贞 永达明玉起 国正天元律迎祖大继昌 河南夏氏家谱辈分我是永城市酂城镇夏氏夏世界具家谱记载洪武二年始祖良... 夏侯姓字辈排行 夏氏辈行,我爷爷明字辈,我父亲应字辈,我是崇字辈,后面是什么辈? 神陵武装恐怖之翼怎么得 金蝶K3中间层账套管理和客户端都无法打开,客户机的客户端打开使用正常。 有哪些明星是亲姐妹? 魔兽温西尔书法套件在哪里 金蝶K3 采购订单不能保存 列名fmrpclosed 无效。如下图,求助中。。。 大小S侯佩岑久违同框,娱乐圈神仙姐妹花还有哪些? 魔兽世界不同天赋可以选不同盟约吗 唐嫣为刘亦菲庆生,明星中还有像这样感情深厚的姐妹花吗? 温西尔书法套件怎么获得 小s和大s同为姐妹,她们的资源差距大吗? 金蝶专业版左侧黑屏 ,点击主功能选项,显示无效图片,重新装了 也是这样 怎么办啊?求救 温西尔刀刃披风幻化怎么获得 台湾最美双胞胎如今怎么样? 台湾“最美双胞胎”长大了!同时被清华大学录取,如今过得怎样? 魔兽世界锁甲技能在哪学的??? 台湾姐妹花嫁伪豪门,大小S有苦说不出,这样的婚姻幸福吗? 魔兽世界4大盟约适应职业? 9.15恶魔猎手选什么盟约? 9.0惩戒骑属性优先级是? 梦到给自己挖坟墓,还准备了骨灰盒 宣野可芬萱野可芳所有资料,知多少答多少 金蝶K3导入初始数据完后提示“使用NULL无效”, 大小S是娱乐圈出名的美女姐妹花,她们的本名叫什么? 金蝶k3使用过程中提示所选账套无效,然后只能退出是怎么回事 求高手解决 金蝶K3突然不能用了,客户端显示如下: 台湾人气姐妹花大小s都分别加入了豪门,但被传出家暴、生活过得不好,到底她们该不该加入豪门? 金蝶K3,委外投料单审核失败,请看图片!谢谢!急 姐妹花大S和小S惊艳全场, 40多岁回到20年前, 为什么他们的颜值能重回巅峰呢? 这对姐妹花是谁?! 急求,口腔上突然长了一个紫黑色的肉疙瘩,黄豆大小看图片,这个是什么?很害怕,今天吃了酸白菜,橄榄, 口腔内壁起紫黑色血泡 口里突然长了个黑紫色血泡 如图,下嘴唇口腔内昨晚长了个黑色的包,无痛,像瘀血。已出现三次,前两次没那么大,好了。这次有点大。 嘴里长了一个黑紫色圆肉泡,不疼。身体没有异常。带牙套一年了。一开始磨了一个小红点,有些突出。半个月 嘴巴里面突然出来个紫色的大泡 你好!口腔内壁出现一个像莲藕似的东西,表示疼痛不舒服,开始是长了一个像黑色或紫色的泡泡,然后不知道 html怎么制作流程图 嘴巴里长了一个紫色的泡,很大,有点疼! 口腔内壁有个黄豆大小的紫黑色的血泡 口腔壁突然起了个2厘米大的紫红色血泡.这是怎么回事?可以自己捅破么?