日期:2014-05-18  浏览次数:20575 次

各位,帮帮忙吧!又遇到麻烦了。
现在遇到个问题?如下的表结构
SQL code

item value
1    11
1    22
1    33
3    aa
3    bb
3    cc
...
11   !!
11   @@
想把它转成
1      3     ...  11
11     aa    ...  !! 
22     bb    ...  @@
33     cc    ...  NULL
也就是item现在是列标题
我现在想到是先行转列把所有的item都取出来,再通过表的列名把原表的数据塞进去。
但是这样实在太麻烦了,有什么好办法吗?



------解决方案--------------------
论坛N多了吧?
------解决方案--------------------
SQL code
create table t(item int,value varchar(10))
insert into t select  1,'11'
insert into t select  1,'22'
insert into t select  1,'33'
insert into t select  3,'aa'
insert into t select  3,'bb'
insert into t select  3,'cc'
insert into t select 11,'!!'
insert into t select 11,'@@'
go

declare @sql varchar(8000)
select @sql=isnull(@sql,'')+',['+rtrim(item)+']=max(case item when '+rtrim(item)+' then [value] end)' 
from (select distinct item from t) a

set @sql='select '+stuff(@sql,1,1,'')+
         ' from (select a.*,(select count(1) from t where item=a.item and [value]<=a.[value]) as id from t a) r group by id'

exec(@sql)
/*
1          3          11         
---------- ---------- ---------- 
11         aa         !!
22         bb         @@
33         cc         NULL
*/
go

drop table t
go

------解决方案--------------------
探讨
还有点问题,item里居然有 [] 这种符号,怎么办啊?

------解决方案--------------------
SQL code
CREATE TABLE TB([item] VARCHAR(10), [value] VARCHAR(2))
INSERT TB 
SELECT 'aa[fre]', '11' UNION ALL 
SELECT 'aa[fre]', '22' UNION ALL 
SELECT 'aa[fre]', '33' UNION ALL 
SELECT '3', 'aa' UNION ALL 
SELECT '3', 'bb' UNION ALL 
SELECT '3', 'cc' UNION ALL 
SELECT 'bb[qqq] ', '!!' UNION ALL 
SELECT 'bb[qqq] ', '@@'

SELECT *,SEQ=ROW_NUMBER() OVER (PARTITION BY item ORDER BY GETDATE())
INTO TC
FROM TB

DECLARE @STR VARCHAR(8000)
SET @STR=''

SELECT @STR=@STR+','+'MAX(CASE WHEN item='''+item+''' THEN value END) AS "'+item+'"'
FROM TB
GROUP BY item 

SET @STR=STUFF(@STR,1,1,'')

EXEC('SELECT '+@STR+' FROM TC GROUP BY SEQ')

DROP TABLE TB,TC
/*
3    aa[fre] bb[qqq] 
---- ------- --------
aa   11      !!
bb   22      @@
cc   33      NULL
*/

------解决方案--------------------
SQL code
quotename:SQL2005关于quotename的用法 
首先,sqlserver里的标识符有一定的规则,比如  你 
create table abc 123(...) 
那么中间含有空格,它不是符合规则的。 

你会写做 create table [abc 123](....) 
即以[]来定界标识符。

quotename将 字串成为有效的标识符。 

它有什么用呢? 我举个例子:


你有个表名字叫做 aa[]bb 

当某些应用动态语句查询时 你如何写呢 
exec('select * from aa[]bb') ?X

set @sql='select * from ' + quotename('aa[]bb') 
exec(@sql) 

当然你也可以直接写出转义的写法 

select * from [aa[]]bb] 

也就是说,quotename 使函数中的输入成为一个有效的标识符。 
比如上例中 aa[]bb 不是一个有效的标识符。

还有一点就是quotename函数有几种写法: 
  quotename('aa') 生成的有效的标识符为 [aa] 
  quotename('aa','') 生成的有效的标识符为 [aa] 
  quotename('aa','''') 生成的有效的标识符为 'aa'