竖的横过来排,怎么做(菜鸟问题)

yuga 2003-07-14 11:41:49
type num id -------数据库
0 2 1
3 2 1
1 2 2
2 3 2
0 2 3

现在想 ---------生成表
type 0 1 2 3
num 2 2 ----同一个id
2 3
2
...全文
29 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2003-07-15
  • 打赏
  • 举报
回复
--创建数据测试环境
create table #tb(type int,num int,id int)
insert into #tb
select 0,2,1
union all select 3,2,1
union all select 1,2,2
union all select 2,3,2
union all select 0,2,3



--得到你要的结果
select [0],[1],[2],[3]
from
(
select id,isnull(cast(sum(case type when 0 then num end) as varchar),'') as [0]
,isnull(cast(sum(case type when 1 then num end) as varchar),'') as [1]
,isnull(cast(sum(case type when 2 then num end) as varchar),'') as [2]
,isnull(cast(sum(case type when 3 then num end) as varchar),'') as [3]
from #tb
group by id
) aa

--删除数据测试环境
drop table #tb
emayongxiang 2003-07-15
  • 打赏
  • 举报
回复
老问题了,给你个例子。
变态的需求,变态的算法!

CREATE proc PSubjectStoH

@ncBranchNo nvarchar(5), --局所名称
@start_date smalldatetime, --起日
@end_date smalldatetime, --止日
@tiTypeNo tinyint, --收入为0数量为1
@ncSubjectNo nvarchar(20) --指标代码

as
Begin
--if @ncBranchNo='#####'
--select @ncBranchNo=''
SET NOCOUNT ON
create table #tSubjectDetail
(
ncBranchNo nvarchar(55)
,ncSubjectNo nvarchar(100)
,mSubjectData money
)
insert into #tSubjectDetail
select c.ncBranchNo+'_'+a.nvcBranchName,c.ncSubjectNo+'_'+b.nvcSubjectName,c.mSubjectData
from tBranch a,tSubjectType b, fnStatisticwhz(@ncBranchNo,@start_date,@end_date,@tiTypeNo,@ncSubjectNo) c
where a.ncBranchNo=c.ncBranchNo and b.ncSubjectNo=c.ncSubjectNo
End
If (select count(*) from #tSubjectDetail)>0
Begin
SET NOCOUNT ON
declare @sql varchar(2000),@fdname varchar(100)
select @sql=''
declare #aa SCROLL cursor for
select distinct ncSubjectNo from #tSubjectDetail
open #aa
fetch next from #aa into @fdname
while @@fetch_status=0
begin
select @sql=@sql+',sum(case when ncSubjectNo=''' +@fdname+''' then mSubjectdata else 0 end) as ['+@fdname+']'
fetch next from #aa into @fdname
end
close #aa
deallocate #aa
select @sql='select ncBranchNo 局所名称,'+right(@sql,len(@sql)-1)+'from #tSubjectDetail group by ncBranchNo'
print @sql

exec(@sql)
drop table #tSubjectDetail
End
Else
Begin
SET NOCOUNT ON
select @sql='select ncBranchNo 局所名称 from #tSubjectDetail'
print @sql

exec(@sql)
drop table #tSubjectDetail

End
GO
yuga 2003-07-15
  • 打赏
  • 举报
回复
都没有做到呀

是不是我要求的表做不到?
I_wanttoknow 2003-07-15
  • 打赏
  • 举报
回复
up
yuga 2003-07-15
  • 打赏
  • 举报
回复
发现这儿都是牛人

什么时候我能有个星星
leimin 2003-07-14
  • 打赏
  • 举报
回复
/*我要实现的功能是:学生资料、科目、成绩均由用户自行添加。请问我的数据库及表设计是否合理,如果不合理,那应该怎么设计?

数据库school里有三个表
student(学生资料表)
字段名称 数据类型 说明
st_id 数值型 学生学号
st_name 文本型 学生姓名

km(科目表)
字段名称 数据类型 说明
kmdh 文本型 科目代号
kmmc 文本型 科目名称

cj(成绩表)
字段名称 数据类型 说明
st_id 数值型 学生学号
kmdh 文本型 科目代号
kmcj 数值型 科目成绩

请问这个表的设计是否合理?要求:求出各学生的成绩及可按各科目成绩排序。
格式如下:请问用SQL(或ASP+SQL 或 C#+SQL)怎么实现?

姓名 显示各科目名称 总分 排序(升降序) 排名

具体取出后的形式为:

姓名 科目一(升 降) 科目二(升 降) 科目三(升 降) 总分(升 降) 排名
张三 80 90 95 265 5
李四 90 90 90 270 4
*/
set nocount on

create table #student(st_id int,st_name varchar(20))
insert #student values (1,'jack')
insert #student values( 2,'Alam')
insert #student values( 3,'john')
insert #student values( 4,'smith')
insert #student values( 5,'rose')


create table #km(kmdh varchar(12),kmmc varchar(20))
insert #km values( '10-1','English')
insert #km values( '10-2','Chinese')
insert #km values( '10-3','chemistry')
insert #km values( '10-4','math')
insert #km values( '10-5','physics')


create table #kmcj(st_id int,kmdh varchar(12),kmcj int)
insert #kmcj values( 1,'10-1',65)
insert #kmcj values( 1,'10-2',55)
insert #kmcj values( 1,'10-3',78)
insert #kmcj values( 1,'10-4',23)
insert #kmcj values( 1,'10-5',56)

insert #kmcj values( 2,'10-1',78)
insert #kmcj values( 2,'10-2',88)
insert #kmcj values( 2,'10-3',88)
insert #kmcj values( 2,'10-4',56)

insert #kmcj values( 3,'10-3',99)


insert #kmcj values( 4,'10-4',55)
insert #kmcj values( 4,'10-3',66)
insert #kmcj values( 4,'10-2',61)




declare @sql varchar(8000)
select @sql=''
select @sql=@sql+',sum(case when kmdh='''+kmdh+''' then kmcj else 0 end) as ['+kmmc+']' from #km
exec ('select identity(int,1,1) as [sequence] ,b.st_name'+@sql+', sum(kmcj) as total into ##t from #kmcj a inner join #student b on a.st_id=b.st_id group by b.st_name order by total desc')

select * from ##t
go

drop table #kmcj
drop table #student
drop table #km
drop table ##t
pengdali 2003-07-14
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select num'
select @sql = @sql + ',sum(case type when '''+cast(type as varchar(10))+''' then id end) ['+cast(type as varchar(10))+']'
from (select distinct type from 有一表) as a
select @sql = @sql+' from 有一表 group by num'

exec(@sql)
go
CrazyFor 2003-07-14
  • 打赏
  • 举报
回复
参考:
create table #(a varchar(100),b int)
insert # values('aa',11)
insert # values('bb',1)
insert # values('aa',45)
insert # values('cc',81)
insert # values('a',11)
insert # values('aay',561)
insert # values('a',14)

declare @sql varchar(8000)
set @sql = 'select '
select @sql = @sql + 'sum(case a when '''+a+'''
then b else 0 end) '+a+'的数量,'
from (select distinct a from #) as a

select @sql = left(@sql,len(@sql)-1) + ' from #'

exec(@sql)

drop table #
CrazyFor 2003-07-14
  • 打赏
  • 举报
回复
参考:
create table #(a varchar(100),b int)
insert # values('aa',11)
insert # values('bb',1)
insert # values('aa',45)
insert # values('cc',81)
insert # values('a',11)
insert # values('aay',561)
insert # values('a',14)

declare @sql varchar(8000)
set @sql = 'select '
select @sql = @sql + 'sum(case a when '''+a+'''
then b else 0 end) '+a+'的数量,'
from (select distinct a from #) as a

select @sql = left(@sql,len(@sql)-1) + ' from #'

exec(@sql)

drop table #
yuga 2003-07-14
  • 打赏
  • 举报
回复
to pengdali(大力 V2.0)
我向生成的表是
将每个id的每个type有数目显示出来
不要统计

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧