首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一道面试的有关问题,想求答案~回答正确马上给分,多谢了

2012-03-19 
一道面试的问题,想求答案~~~~~回答正确马上给分,谢谢了今天去面试,有一道面试的题目没做出来,具体表结构记

一道面试的问题,想求答案~~~~~回答正确马上给分,谢谢了
今天去面试,有一道面试的题目没做出来,具体表结构记不太清楚了。
但是大概意思是,有一表,他里面的字段显示的内容有重复的~~~你要
查询出另外一表,把第一个表的重复字段变成列显示,求答案,有没有朋友也做过类似的题目啊,等于就是把一张表竖过来显示,内容边成字段~~~有做过的要是能把题目和答案都发出来就更好了,明天还要去面试我想把这个问题解决了,大家快点帮我下啊~~~~~~~~~~

[解决办法]
if exists (select * from dbo.sysobjects
where id = object_id(N '[dbo].[p_zj] ') and OBJECTPROPERTY(id, N 'IsProcedure ') = 1)
drop procedure [dbo].[p_zj]
GO

/*--行列互换的通用存储过程 : 将指定的表,按指定的字段进行行列互换

--邹建 2004.04--

--使用示例

--测试数据
create table 表(类别 varchar(10),男性 decimal(20,1),女性 decimal(20,1))
insert 表 select '小说 ',38.0,59.2
union all select '散文 ',18.9,30.6
union all select '哲学 ',16.2,10.2

--要求转换结果
/*
性别 小说 散文 哲学
---- ----- ----- -----
男性 38.0 18.9 16.2
女性 59.2 30.6 10.2
*/

--调用存储过程
exec p_zj '表 ', '类别 ', '性别 '

--删除测试
drop table 表
*/

create proc p_zj
@tbname sysname, --要处理的表名
@fdname sysname, --做为转换的列名
@new_fdname sysname= ' ' --为转换后的列指定列名
as
declare @s1 varchar(8000),@s2 varchar(8000)
,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000)
,@i varchar(10)
select @s1= ' ',@s2= ' ',@s3= ' ',@s4= ' ',@s5= ' ',@i= '0 '
select @s1=@s1+ ',@ '+@i+ ' varchar(8000) '
,@s2=@s2+ ',@ '+@i+ '= ' ' '+case isnull(@new_fdname, ' ') when ' ' then ' '
else @new_fdname+ '= ' end+ ' ' ' ' ' '+name+ ' ' ' ' ' ' ' '
-- ,@s2=@s2+ ',@ '+@i+ '= ' '性别= ' ' ' ' '+name+ ' ' ' ' ' ' ' '
,@s3=@s3+ '
select @ '+@i+ '=@ '+@i+ '+ ' ',[ ' '+[ '+@fdname+ ']+ ' ']= ' '+cast([ '+name+ '] as varchar) from [ '+@tbname+ '] '
,@s4=@s4+ ',@ '+@i+ '= ' 'select ' '+@ '+@i
,@s5=@s5+ '+ ' ' union all ' '+@ '+@i
,@i=cast(@i as int)+1
from syscolumns
where object_id(@tbname)=id and name <> @fdname

select @s1=substring(@s1,2,8000)
,@s2=substring(@s2,2,8000)
,@s4=substring(@s4,2,8000)
,@s5=substring(@s5,16,8000)
exec( 'declare '+@s1+ '
select '+@s2+@s3+ '
select '+@s4+ '
exec( '+@s5+ ') ')
go
[解决办法]
是不是行列转换?


這個是魚兄寫的,我給你看看


--創建測試環境
Create Table tabl1
(ID Int,
[Date] Varchar(10),
col1 Int,
col2 Int)
Insert tabl1 Select 1, '2007-1-1 ', 111, 222
Union All Select 2, '2007-2-1 ', 234, 245
Union All Select 3, '2007-3-1 ', 456, 367

Create Table tabl2
(ID Int,
Name Varchar(10),
[Date] Varchar(10),
value Int)
Insert tabl2 Select 1, 'aaa ', '2007-1-1 ', 345
Union All Select 2, 'bbb ', '2007-1-1 ', 245
Union All Select 3, 'ccc ', '2007-1-1 ', 223
Union All Select 4, 'ddd ', '2007-1-1 ', 355
Union All Select 1, 'aaa ', '2007-2-1 ', 423
Union All Select 2, 'bbb ', '2007-2-1 ', 345
Union All Select 3, 'ccc ', '2007-2-1 ', 568
Union All Select 4, 'ddd ', '2007-2-1 ', 435


Union All Select 1, 'aaa ', '2007-3-1 ', 356
Union All Select 2, 'bbb ', '2007-3-1 ', 123
Union All Select 3, 'ccc ', '2007-3-1 ', 536
Union All Select 4, 'ddd ', '2007-3-1 ', 341
GO
--測試
--如果name是固定的
Select
A.[Date],
A.col1,
A.col2,
SUM(Case B.Name When 'aaa ' Then value Else 0 End) As aaa,
SUM(Case B.Name When 'bbb ' Then value Else 0 End) As bbb,
SUM(Case B.Name When 'ccc ' Then value Else 0 End) As ccc,
SUM(Case B.Name When 'ddd ' Then value Else 0 End) As ddd
From
tabl1 A
Inner Join
tabl2 B
On A.[Date] = B.[Date]
Group By
A.[Date],
A.col1,
A.col2

--如果name不是固定的
Declare @S Varchar(8000)
Select @S = ' Select A.[Date], A.col1, A.col2 '
Select @S = @S + ', SUM(Case B.Name When ' ' ' + Name + ' ' ' Then value Else 0 End) As [ ' + Name + '] '
From tabl2 Group By Name Order By Min(ID)
Select @S = @S + ' From tabl1 A Inner Join tabl2 B On A.[Date] = B.[Date] Group By A.[Date], A.col1, A.col2 '
EXEC(@S)
GO
--刪除測試環境
Drop Table tabl1, tabl2
--結果
/*
Datecol1col2aaabbbcccddd
2007-1-1111222345245223355
2007-2-1234245423345568435
2007-3-1456367356123536341
*/

[解决办法]
declare @t1 table(id int,col1 varchar(100))
insert into @t1 select 1, 'A '
union all select 2, 'A '
union all select 3, 'B '
union all select 4, 'B '
union all select 5, 'C '
union all select 6, 'D '
union all select 7, 'D '
union all select 8, 'D '


declare @t2 table(id int,col1 varchar(100),col2 varchar(100))
insert into @t2 select 1, 'B ', 'B '

select * from @t1
1A
2A
3B
4B
5C
6D
7D
8D


select * from @t2
1BB


declare @sql varchar(1000)
select @sql= 'alter table #t2 add '
select @sql=@sql+ col1 + ' varchar(100), '
from(
select col1,count(col1) countcol1 from #t1 group by col1 having count(col1)> 1
) t
select @sql=left(@sql,len(@sql)-1)
execute(@sql)


select * from #t2

1BBNULLNULLNULL


用alter table ... add
将#t1 表中重复的行 作为列插入到#T2表中...

热点排行