27,579
社区成员
发帖
与我相关
我的任务
分享
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
w2010 INT,
w2011 INT,
w2012 INT,
w2013 INT,
w2014 INT,
date1 DATE,
date2 DATE
)
GO
SET NOCOUNT ON
INSERT INTO t VALUES (100,200,200,230,440,'2011-01-01','2014-12-31')
GO
------- 以上为测试数据 -------
DECLARE @tableName NVARCHAR(50),@sql NVARCHAR(MAX)
SET @tableName='t'
SELECT @sql=ISNULL(@sql,'')+
'
UNION ALL
SELECT '''+RIGHT(c.name,4)+'-01-01'' AS date1 , '+c.name+' as score
FROM t WHERE '''+RIGHT(c.name,4)+'-01-01''>=date1 AND '''+RIGHT(c.name,4)+'-01-01''<=date2'
FROM sys.[columns] AS c WHERE c.[object_id]=object_id(@tableName) AND c.name LIKE 'w[1-2][0-9][0-9][0-9]'
SET @sql=STUFF(@sql,1,12,'')
--PRINT @sql
EXEC(@sql)
/*
date1 score
---------- -----------
2011-01-01 200
2012-01-01 200
2013-01-01 230
2014-01-01 440
*/
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
w2010 INT,
w2011 INT,
w2012 INT,
w2013 INT,
w2014 INT,
date1 DATE,
date2 DATE
)
GO
INSERT INTO t VALUES (100,200,200,230,440,'2011-01-01','2014-12-31')
--
SELECT '2010-01-01' AS date1 , w2010 as score
FROM t WHERE '2010-01-01'>=date1 AND '2010-01-01'<=date2
UNION ALL
SELECT '2011-01-01' AS date1 , w2011 as score
FROM t WHERE '2011-01-01'>=date1 AND '2011-01-01'<=date2
UNION ALL
SELECT '2012-01-01' AS date1 , w2012 as score
FROM t WHERE '2012-01-01'>=date1 AND '2012-01-01'<=date2
UNION ALL
SELECT '2013-01-01' AS date1 , w2013 as score
FROM t WHERE '2013-01-01'>=date1 AND '2013-01-01'<=date2
UNION ALL
SELECT '2014-01-01' AS date1 , w2014 as score
FROM t WHERE '2014-01-01'>=date1 AND '2014-01-01'<=date2
/*
date1 score
---------- -----------
2011-01-01 200
2012-01-01 200
2013-01-01 230
2014-01-01 440
*/