日期:2014-05-18 浏览次数:20724 次
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都取出来,再通过表的列名把原表的数据塞进去。 但是这样实在太麻烦了,有什么好办法吗?
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
------解决方案--------------------
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
*/
------解决方案--------------------
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'