SQL Server 行列转换(2)
参考前一个例子http://www.cnblogs.com/insus/articles/1969896.html,现想使用另外一种方式来处理行列转换,实现下面效果:
参考代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
BEGIN
IF OBJECT_ID ('[dbo].[#t]') IS NOT NULL
DROP TABLE [dbo].[#t]
CREATE TABLE [dbo].[#t]
(
id INT IDENTITY(1,1), --产生唯一字段,稍后为循环使用
RId NVARCHAR(2),
DT DATE,
Hits INT
)
--把需要处理的数据记录预存入这个临时表中
INSERT INTO [dbo].[#t] SELECT [RId],[DT],[Hits] FROM [dbo].[RecordHits]
END
--创建一个临时表,为处理记录所需要表最初表结构
BEGIN
IF OBJECT_ID('[dbo].[#rList]') IS NOT NULL
DROP TABLE [dbo].[#rList]
CREATE TABLE [dbo].[#rList]
(
DT DATE --此字段将确定是以日期为记录
)
END
BEGIN
--宣告一些变量,为循环记录时所使用
DECLARE @N INT = 1, @R INT
DECLARE @RId NVARCHAR(2),@DT DATE
DECLARE @Hits INT
SET @R = (SELECT MAX([id]) FROM [dbo].[#t])
WHILE @N <= @R
BEGIN
--取出每笔记录值
SELECT @RId = [RId],@DT = [DT],@Hits = [Hits] FROM [dbo].[#t] WHERE [id] = @N
--判断此次循环的记录RId作为临时表[dbo].[#rList]一个字段,如果不存在,修改这个临时表,增加字段,反之,将略去执行下面SQL语句
EXECUTE('IF NOT EXISTS(SELECT name FROM tempdb..syscolumns where id=OBJECT_ID(''tempdb..[#rList]'') AND tempdb..syscolumns.name ='''+ @RId +''') ALTER TABLE tempdb..[#rList] ADD [' + @RId + '] NVARCHAR(10)')
--判断此次循环的记录在临时表是否存在,如果不存在
IF NOT EXISTS (SELECT [DT] FROM [dbo].[#rList] WHERE [DT] = @DT)
--插入此笔记录
INSERT INTO [dbo].[#rList]([DT]) VALUES (@DT)
--更新记录。
EXECUTE('UPDATE [dbo].[#rList] SET ['+ @RId +'] = '''+ @Hits +''' WHERE [DT] = '''+ @DT +'''')
--循环下一笔
SET @N = @N + 1
END--结束循环
END
--查询处理结果
SELECT * FROM [dbo].[#rList]
IF OBJECT_ID ('[dbo].[#t]') IS NOT NULL
DROP TABLE [dbo].[#t]
CREATE TABLE [dbo].[#t]
(
id INT IDENTITY(1,1), --产生唯一字段,稍后为循环使用
RId NVARCHAR(2),
DT DATE,
Hits INT
)
--把需要处理的数据记录预存入这个临时表中
INSERT INTO [dbo].[#t] SELECT [RId],[DT],[Hits] FROM [dbo].[RecordHits]
END
--创建一个临时表,为处理记录所需要表最初表结构
BEGIN
IF OBJECT_ID('[dbo].[#rList]') IS NOT NULL
DROP TABLE [dbo].[#rList]
CREATE TABLE [dbo].[#rList]
(
DT DATE --此字段将确定是以日期为记录
)
END
BEGIN
--宣告一些变量,为循环记录时所使用
DECLARE @N INT = 1, @R INT
DECLARE @RId NVARCHAR(2),@DT DATE
DECLARE @Hits INT
SET @R = (SELECT MAX([id]) FROM [dbo].[#t])
WHILE @N <= @R
BEGIN
--取出每笔记录值
SELECT @RId = [RId],@DT = [DT],@Hits = [Hits] FROM [dbo].[#t] WHERE [id] = @N
--判断此次循环的记录RId作为临时表[dbo].[#rList]一个字段,如果不存在,修改这个临时表,增加字段,反之,将略去执行下面SQL语句
EXECUTE('IF NOT EXISTS(SELECT name FROM tempdb..syscolumns where id=OBJECT_ID(''tempdb..[#rList]'') AND tempdb..syscolumns.name ='''+ @RId +''') ALTER TABLE tempdb..[#rList] ADD [' + @RId + '] NVARCHAR(10)')
--判断此次循环的记录在临时表是否存在,如果不存在
IF NOT EXISTS (SELECT [DT] FROM [dbo].[#rList] WHERE [DT] = @DT)
--插入此笔记录
INSERT INTO [dbo].[#rList]([DT]) VALUES (@DT)
--更新记录。
EXECUTE('UPDATE [dbo].[#rList] SET ['+ @RId +'] = '''+ @Hits +''' WHERE [DT] = '''+ @DT +'''')
--循环下一笔
SET @N = @N + 1
END--结束循环
END
--查询处理结果
SELECT * FROM [dbo].[#rList]