原帖:http://blog.csdn.net/htl258/archive/2010/04/02/5443475.aspx
原贴地址:http://topic.csdn.net/u/20100401/10/c405fc4e-ce50-4d0c-8452-d9e9c42324ba.html?98297
N个表中数据,插入到临时表A
#A表数据有
a b c d e f.......
2009-01-01 1 1 1 1 1........
2009-01-02 1 1 1 1 1.......
2009-01-03 1 1 1 1 1.......
.
2009-12-31
.
需要搜索出的样子(如果时间搜索的范围在1到2月的话横向列出一到2月的数据(其他月份不显示),如果2到3月的话横向列出
2到3月的数据,如果搜索1到12月的话列出1到12月的数据)
a b b d e f .... a b c d e f ....
2009-01-01 1 1 1 1 1 .... 2009-02-01 1 1 1 1 1 ....
. . . . . . .... 2009-02-02 1 1 1 1 1 ....
. . . . . . .... . . . . . . ....
2009-01-30 1 1 1 1 1 .... 2009-02-28 1 1 1 1 1 ....
--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-02 04:35:33
-- Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------
--> 生成测试数据表 :tb
IF NOT OBJECT_ID ( '[tb]' ) IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ( [a] DATETIME , [b] INT , [c] INT , [d] INT , [e] INT , [f] INT )
INSERT [tb]
SELECT N'2009-01-01' , 1, 1, 1, 1, 1 UNION ALL
SELECT N'2009-01-02' , 2, 2, 2, 2, 2 UNION ALL
SELECT N'2009-01-03' , 3, 3, 3, 3, 3 UNION ALL
SELECT N'2009-02-03' , 1, 1, 1, 1, 1 UNION ALL
SELECT N'2009-02-04' , 2, 3, 4, 5, 6 UNION ALL
SELECT N'2009-04-05' , 1, 1, 1, 1, 1
GO
--SELECT * FROM [tb]
-->SQL 查询如下 :
IF NOT OBJECT_ID ( '[SP_TEST]' ) IS NULL
DROP PROC [SP_TEST]
GO
CREATE PROC SP_TEST
@BEGMONTH NVARCHAR ( 10)= '1' , -- 格式可为 2010-02( 考虑跨年 ) 或 ( 表示当前年度的月份 )
@ENDMONTH NVARCHAR ( 10)= '2' -- 格式可为 2010-02( 考虑跨年 ) 或 ( 表示当前年度的月份 )
AS
IF CHARINDEX ( '-' , @BEGMONTH )= 0
SET @BEGMONTH = DATENAME ( YY , GETDATE ())+ '-' + @BEGMONTH + '-1'
ELSE
SET @BEGMONTH = @BEGMONTH + '-1'
IF CHARINDEX ( '-' , @ENDMONTH )= 0
SET @ENDMONTH = CONVERT ( NVARCHAR ( 10), DATEADD ( MM , 1, DATENAME ( YY , GETDATE ())+ '-' + @ENDMONTH + '-1' )- 1, 23)
ELSE
SET @ENDMONTH = CONVERT ( NVARCHAR ( 10), DATEADD ( MM , 1, @ENDMONTH + '-1' )- 1, 23)
DECLARE @S NVARCHAR (MAX ), @I INT
SET @I = 0
WHILE @I < DATEDIFF ( MM , @BEGMONTH , @ENDMONTH )+ 1
BEGIN
SELECT @S = ISNULL ( @S , '' )+ ' LEFT JOIN '
+ '(SELECT CONVERT(NVARCHAR(10),DATEADD(DD,A.NUMBER,''' + CONVERT ( NVARCHAR ( 10), DATEADD ( MM , @I , @BEGMONTH ), 23)+ '''),23) 日期 ,B.B,B.C,B.D,B.E,B.F
FROM MASTER..SPT_VALUES A '
+ 'LEFT JOIN TB B
ON DATEADD(DD,A.NUMBER,'''
+ CONVERT ( NVARCHAR ( 10), DATEADD ( MM , @I , @BEGMONTH ), 23)+ ''')=B.A
WHERE A.TYPE=''P'' AND A.NUMBER <= DATEDIFF(DD,'''
+ CONVERT ( NVARCHAR ( 10), DATEADD ( MM , @I , @BEGMONTH ), 23)+ ''','''
+ CONVERT ( NVARCHAR ( 10), DATEADD ( MM , @I + 1, @BEGMONTH )- 1, 23)+ ''')) T' + LTRIM ( @I )
+ CASE WHEN @I >- 1 THEN ' ON A. 序号 =DAY(T' + LTRIM ( @I )+ '. 日期 ) ' ELSE '' END
SET @I = @I + 1
END
SET @S = 'SELECT * FROM (SELECT 序号 =NUMBER+1 FROM MASTER..SPT_VALUES WHERE TYPE=''P'' AND NUMBER<31) A ' + @S
EXEC SP_EXECUTESQL @S , N'@BEGMONTH NVARCHAR(10),@ENDMONTH NVARCHAR(10)' , @BEGMONTH , @ENDMONTH
GO
EXEC SP_TEST '2009-1' , '2009-2'
/*
序号 日期 B C D E F 日期 B C D E F
----------- ---------- ----------- ----------- ----------- ----------- ----------- ---------- ----------- ----------- ----------- ----------- -----------
1 2009-01-01 1 1 1 1 1 2009-02-01 NULL NULL NULL NULL NULL
2 2009-01-02 2 2 2 2 2 2009-02-02 NULL NULL NULL NULL NULL
3 2009-01-03 3 3 3 3 3 2009-02-03 1 1 1 1 1
4 2009-01-04 NULL NULL NULL NULL NULL 2009-02-04 2 3 4 5 6
5 2009-01-05 NULL NULL NULL NULL NULL 2009-02-05 NULL NULL NULL NULL NULL
6 2009-01-06 NULL NULL NULL NULL NULL 2009-02-06 NULL NULL NULL NULL NULL
7 2009-01-07 NULL NULL NULL NULL NULL 2009-02-07 NULL NULL NULL NULL NULL
8 2009-01-08 NULL NULL NULL NULL NULL 2009-02-08 NULL NULL NULL NULL NULL
9 2009-01-09 NULL NULL NULL NULL NULL 2009-02-09 NULL NULL NULL NULL NULL
10 2009-01-10 NULL NULL NULL NULL NULL 2009-02-10 NULL NULL NULL NULL NULL
11 2009-01-11 NULL NULL NULL NULL NULL 2009-02-11 NULL NULL NULL NULL NULL
12 2009-01-12 NULL NULL NULL NULL NULL 2009-02-12 NULL NULL NULL NULL NULL
13 2009-01-13 NULL NULL NULL NULL NULL 2009-02-13 NULL NULL NULL NULL NULL
14 2009-01-14 NULL NULL NULL NULL NULL 2009-02-14 NULL NULL NULL NULL NULL
15 2009-01-15 NULL NULL NULL NULL NULL 2009-02-15 NULL NULL NULL NULL NULL
16 2009-01-16 NULL NULL NULL NULL NULL 2009-02-16 NULL NULL NULL NULL NULL
17 2009-01-17 NULL NULL NULL NULL NULL 2009-02-17 NULL NULL NULL NULL NULL
18 2009-01-18 NULL NULL NULL NULL NULL 2009-02-18 NULL NULL NULL NULL NULL
19 2009-01-19 NULL NULL NULL NULL NULL 2009-02-19 NULL NULL NULL NULL NULL
20 2009-01-20 NULL NULL NULL NULL NULL 2009-02-20 NULL NULL NULL NULL NULL
21 2009-01-21 NULL NULL NULL NULL NULL 2009-02-21 NULL NULL NULL NULL NULL
22 2009-01-22 NULL NULL NULL NULL NULL 2009-02-22 NULL NULL NULL NULL NULL
23 2009-01-23 NULL NULL NULL NULL NULL 2009-02-23 NULL NULL NULL NULL NULL
24 2009-01-24 NULL NULL NULL NULL NULL 2009-02-24 NULL NULL NULL NULL NULL
25 2009-01-25 NULL NULL NULL NULL NULL 2009-02-25 NULL NULL NULL NULL NULL
26 2009-01-26 NULL NULL NULL NULL NULL 2009-02-26 NULL NULL NULL NULL NULL
27 2009-01-27 NULL NULL NULL NULL NULL 2009-02-27 NULL NULL NULL NULL NULL
28 2009-01-28 NULL NULL NULL NULL NULL 2009-02-28 NULL NULL NULL NULL NULL
29 2009-01-29 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
30 2009-01-30 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
31 2009-01-31 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
(31 行受影响 )
*/