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

如何样动态创建这样的表?(一个面试题不会做)

2012-01-19 
怎么样动态创建这样的表?(一个面试题不会做)有这样的一个题目:有一个Name表是下面这样的:NameYearMoneylan

怎么样动态创建这样的表?(一个面试题不会做)
有这样的一个题目:有一个Name表是下面这样的:
Name                             Year                       Money
  lan                               1993                       1
jim                                 1993                       2
lan                                 1994                       3
jim                                 1994                       2

最后要显示成这样的表
Name                       1993                                     1994
lan                             1                                         3
jim                             2                                         2
第一行是字段名,要求用一句SQL语句写出来,30分,我知道需要动态创建表,但是不会写这条语句,现在贴出来,大家分析分析,看如何写。

[解决办法]
如果就是这些数据...

select name , sum (case when year =1993 then money else 0 end ) as [1993]
, sum (case when year =1994 then money else 0 end ) as [1994]
from name
group by name
[解决办法]
create table test (name char(10),year char(10),[Money] int)
go
insert test values( 'lan ', '1993 ',1)
insert test values( 'jim ', '1993 ',2)
insert test values( 'lan ', '1994 ',3)
insert test values( 'jim ', '1994 ',2)

declare @sql varchar(8000)
set @sql = 'select name '
select @sql = @sql + ',sum(case year when ' ' '+rtrim(year)+ ' ' ' then [Money] end) [ '+rtrim(year)+ '] '
from (select distinct year from test) as a
select @sql = @sql+ ' from test group by name '
exec(@sql)

drop table test

--结果
/*
name19931994
-----------------------------
jim 22
lan 13
*/
[解决办法]
动态吗?

create table #(A varchar(20),B varchar(20),C varchar(20))
insert into #
select 'x ', '01 ', 'aaa ' union
select 'x ', '02 ', 'bbb ' union
select 'x ', '03 ', 'ccc ' union
select 'y ', '01 ', 'ddd ' union
select 'y ', '03 ', 'eee ' union
select 'z ', '04 ', 'fff '
go

--处理语句
declare
@sql varchar(8000),
@sq varchar(8000)



select @sql= ' '
select @sql=@sql+ ',[ '+B+ ']=max(case B when ' ' '+B+ ' ' ' then C end) '
from #
group by B

set @sq= 'select A '+@sql+ ' from # group by A '

print @sq
exec(@sq)
--删除测试表


drop table #
go
=======================

----SQL SEVER 2005(如下)----
--测试环境
Create table TA(A varchar(10), B varchar(10), C varchar(10))
insert into TA select 'x ', '01 ', 'aaa '
union all select 'x ', '02 ', 'bbb '
union all select 'x ', '03 ', 'ccc '
union all select 'y ', '01 ', 'ddd '
union all select 'y ', '03 ', 'eee '
union all select 'z ', '04 ', 'fff '

--动态SQL
DECLARE @PIT AS VARCHAR(200)
SET @PIT= ' '
SELECT @PIT=@PIT+ ',[ '+B+ '] ' FROM TA
GROUP BY B
SET @PIT=STUFF(@PIT,1,1, ' ')
EXEC( '
select * from Ta
PIVOT
(MAX(C)
FOR B IN ( '+@PIT+ ')
) PT
')
--结果
/*
A 01 02 03 04
---------- ---------- ---------- ---------- ----------
x aaa bbb ccc NULL
y ddd NULL eee NULL
z NULL NULL NULL fff

(3 行受影响)

*/
[解决办法]
case when是什么意思呢?
----------
请使用SQL联机帮助...
大概就是 当 ** 的时候 选择...
[解决办法]
就是判断语句和if ..else差不多

热点排行