怎么样动态创建这样的表?(一个面试题不会做)
有这样的一个题目:有一个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差不多