例如:
fID fUserName fBookName
1 张三 《邓论》
2 张三 《毛概》
3 张三 《马哲》
4 李四 《邓论》
5 李四 《政经》
6 王五 《毛概》显示成fID fUserName fBookName fID fUserName fBookName fID fUserName fBookName
1 张三 《邓论》 1 张三 邓论》 1 张三 《邓论》就算是相同的值也要另外显示成一列。要求有列名。提取数据集中的前三条。通过一个ID来查询数据。 急啊。拜托啦!!!
fID fUserName fBookName
1 张三 《邓论》
2 张三 《毛概》
3 张三 《马哲》
4 李四 《邓论》
5 李四 《政经》
6 王五 《毛概》显示成fID fUserName fBookName fID fUserName fBookName fID fUserName fBookName
1 张三 《邓论》 1 张三 邓论》 1 张三 《邓论》就算是相同的值也要另外显示成一列。要求有列名。提取数据集中的前三条。通过一个ID来查询数据。 急啊。拜托啦!!!
--> 数据库版本:
--> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
--> 测试数据:[TB]
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[TB]')
AND type in (N'U'))
DROP TABLE [TB]
GO---->建表
create table [TB]([fID] int,[fUserName] varchar(4),[fBookName] varchar(8))
insert [TB]
select 1,'张三','《邓论》' union all
select 2,'张三','《毛概》' union all
select 3,'张三','《马哲》' union all
select 4,'李四','《邓论》' union all
select 5,'李四','《政经》' union all
select 6,'王五','《毛概》'
GOselect min([fID]) as [fID],[fUserName],
max(case fBookName when '《邓论》' then fBookName else '' end) as 'fBookName',
min([fID])as [fID],[fUserName],
max(case fBookName when'《毛概》' then fBookName else '' end) as 'fBookName',
min([fID])as [fID],[fUserName],
max(case fBookName when '《马哲》' then fBookName else '' end) as 'fBookName'
from [TB] group by [fUserName]
--> 查询结果
SELECT *
FROM [TB]
--> 删除表格
--DROP TABLE [TB]
go
if object_id('test.dbo.tb') is not null drop table tb
-- 创建数据表
create table tb
(
fID char(1),
fUserName char(5),
fBookName char(9)
)
go
--插入测试数据
insert into tb select '1','张三','《邓论》'
union all select '2','张三','《毛概》'
union all select '3','张三','《马哲》'
union all select '4','李四','《邓论》'
union all select '5','李四','《政经》'
union all select '6','王五','《毛概》'
go
--代码实现declare @s varchar(max)
select @s=isnull(@s+',','')+'fID=max(case when idd='+rtrim(idd)+' then fID else '''' end)'
+',fUserName=max(case when idd='+rtrim(idd)+' then fUserName else '''' end)'
+',fBookName=max(case when idd='+rtrim(idd)+' then fBookName else '''' end)'
from(select distinct idd=row_number()over(partition by fUserName order by fID) from tb)a
exec('select '+@s+' from (select distinct idd=row_number()over(partition by fUserName order by fID),* from tb)t group by fUserName')/*测试结果fID fUserName fBookName fID fUserName fBookName fID fUserName fBookName
----------------------------------------------------------------------------
4 李四 《邓论》 5 李四 《政经》
6 王五 《毛概》
1 张三 《邓论》 2 张三 《毛概》 3 张三 《马哲》 (3 行受影响)
*/
6 王五 《毛概》
4 李四 《??》 5 李四 《政?》 但是我在SQL 08 里面执行出来是这样的??可不可以将这个结果,放入到一个临时表里面啊?因为我还要用这个结果去 join 其他的table ??
nvarchar()类型
就不会乱码了
go
if object_id('tb') is not null drop table tb
-- 创建数据表
create table tb
(
fID char(1),
fUserName Nchar(10),
fBookName Nchar(20)
)
go
--插入测试数据
insert into tb select '1',N'张三',N'《邓论》'
union all select '2',N'张三',N'《毛概》'
union all select '3',N'张三',N'《马哲》'
union all select '4',N'李四',N'《邓论》'
union all select '5',N'李四',N'《政经》'
union all select '6',N'王五',N'《毛概》'
go
--代码实现declare @s nvarchar(max)
select @s=isnull(@s+',','')+'fID=max(case when idd='+rtrim(idd)+' then fID else '''' end)'
+',fUserName=max(case when idd='+rtrim(idd)+' then fUserName else '''' end)'
+',fBookName=max(case when idd='+rtrim(idd)+' then fBookName else '''' end)'
from(select distinct idd=row_number()over(partition by fUserName order by fID) from tb)a
exec('select '+@s+' from (select distinct idd=row_number()over(partition by fUserName order by fID),* from tb)t group by fUserName')
--创建数据表 tt 后
insert into tt exec('select '+@s+' from (select ....')