报表按月份横向显示处理

原帖: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 行受影响 )

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值