原贴地址: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 行受影响)
*/