行列转换

博客展示了多个SQL操作示例,包括创建表、插入数据、查询统计等。如创建成绩表和满意度表,插入学生成绩和客户满意度数据,通过动态SQL进行行列转换和统计,还涉及成绩排名、数据汇总等操作,最后给出了产品合格情况的统计示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Create table test (name char(10),km char(10),cj int)
insert test values('张三','语文',80)
insert test values('张三','数学',86)
insert test values('张三','英语',75)
insert test values('李四','语文',78)
insert test values('李四','数学',85)
insert test values('李四','英语',77)

--查询
declare @sql varchar(8000),@s1 varchar(8000)
select @sql = '',@s1=''

select @sql = @sql+ ',['+km+']=sum(case km when '''+km+''' then cj else 0 end)'
,@s1=@s1+',sum(case km when '''+km+''' then cj else 0 end)/sum(case km when '''+km+''' then 1 else 0 end)'
from test
group by km
exec('select name=case grouping(name) when 1 then ''全班总分'' else name end'+@sql+',小计=sum(cj)
from test
group by name with rollup
union all
select ''全班平均分'''+@s1+',sum(cj)/count(distinct name)
from test')
go

--删除测试
drop table test

/*--测试结果

name 数学 英语 语文 小计
---------- ----------- ----------- ----------- -----------
李四 85 77 78 240
张三 86 75 80 241
全班总分 171 152 158 481
全班平均分 85 76 79 240
--*/


--------------------------------------------------------------------------
create table A
(
CSC_ID varchar(10),
NAME varchar(20),
MYD varchar(20),
Answer varchar(20)
)
insert A
select 'GS011','范学喜','维修时间满意度','满意' union
select 'GS011','范学喜','服务态度满意度','满意' union
select 'GS011','范学喜','总体满意度','非常满意' union
select 'GS033','邢金海','维修时间满意度','满意' union
select 'GS033','邢金海','服务态度满意度','满意' union
select 'GS033','邢金海','总体满意度','非常满意' union
select 'GS033','马德芳','维修时间满意度','满意' union
select 'GS033','马德芳','服务态度满意度','满意' union
select 'GS033','马德芳','总体满意度','满意' union
select 'GS090','陈巧林','维修时间满意度','满意' union
select 'GS090','陈巧林','服务态度满意度','不满意' union
select 'GS090','陈巧林','总体满意度','一般'

--查询
declare @sql varchar(1000)
set @sql=''
select @sql=@sql+',max(case when MYD='''+MYD+''' then Answer end) as '''+MYD+''''
from A group by MYD
select @sql='select CSC_ID,NAME'+@sql+' from A group by CSC_ID,NAME'
exec(@sql)



--------------------------------------------
这个是邹建提供的例子:希望能解决你的问题 你可照着改一下
--成绩统计示例
--测试表
create table #t(xh varchar(3),xm varchar(10),km varchar(10),cj int)
insert into #t
select '001','张三','语文',80
union all select '001','张三','数学',85
union all select '002','李四','语文',90
union all select '002','李四','数学',80
union all select '003','王五','语文',70
union all select '003','王五','数学',78

--数据处理
declare @sql nvarchar(4000),@sql1 nvarchar(4000)
select @sql='',@sql1=''
select @sql=@sql+',['+km
+']=sum(case km when '''+km+''' then cj else 0 end)'
,@sql1=@sql1+',['+km+'名次]=(select sum(1) from # where ['
+km+']>=a.['+km+'])'
from(select distinct km from #t) a
exec('select xh 学号,xm 姓名'+@sql+',总成绩=sum(cj)
,总名次=(select sum(1) from(select xh,aa=sum(cj) from #t group by xh) aa where sum(a.cj)<=aa)
into # from #t a group by xh,xm
select *'+@sql1+' from # a
')


drop table #t

/*--测试结果

学号 姓名 数学 语文 总成绩 总名次 数学名次 语文名次
---- ------ ------- -------- ----------- ----------- ----------- -----------
002 李四 80 90 170 1 2 1
003 王五 78 70 148 3 3 3
001 张三 85 80 165 2 1 2

--*/



-------------------------------------------------------------------------
可以汇总两列数据
declare @sql varchar(8000),@s1 varchar(8000)
select @sql = '',@s1=''

select @sql = @sql+ ',['+simplename+']=sum(case simplename when '''+simplename+''' then num else 0 end)'
+ ',[【'+simplename+'】得分]=sum(case simplename when '''+simplename+''' then score else 0 end)'
from TempStatisfy
group by simplename
print @sql

exec('select Domain_Name as ''区域'',Province_Name as ''省份'' ,CSC_ID as ''客户认可号'' ,CSC_Type as ''单位性质'' ,CSC_Name as ''单位名称'' '+@sql+'
from TempStatisfy
group by Domain_Name,Province_Name,CSC_ID,CSC_Type,CSC_Name
')





-------------------------------------------

Create table TTTTTTT (csc_id char(10),product_name char(10),check_isoob bit)

insert TTTTTTT values('js001','700-U ',1)
insert TTTTTTT values('js001','700-UT ',1)
insert TTTTTTT values('js001','702-KM6 ',0)
insert TTTTTTT values('js001','702-A66+ ',0)

insert TTTTTTT values('js002','700-U ',1)
insert TTTTTTT values('js002','700-UT ',1)
insert TTTTTTT values('js002','702-KM6 ',0)
insert TTTTTTT values('js002','702-A66+ ',0)



declare @sql varchar(8000),@s1 varchar(8000)
select @sql = '',@s1=''

select @sql = @sql+ ',['+product_name+']=count(case when product_name ='''+product_name+''' and check_isoob=1 then check_isoob end)'
,@s1=@s1+',count(case when product_name= '''+product_name+''' and check_isoob=1 then check_isoob end)/count(case when product_name ='''+product_name+''' and check_isoob=1 then end)'
from ttttttt
group by product_name
print @sql
exec('select csc_id=case grouping(csc_id) when 1 then ''合计'' else csc_id end'+@sql+',合格=count(case when check_isoob=1 then check_isoob end ),不合格=count(case when check_isoob=0 then check_isoob end ),合计=count( check_isoob )
from ttttttt
group by csc_id with rollup
')





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值