现在的位置: 首页 > 综合 > 正文

报表按月份横向显示处理

2012年02月12日 ⁄ 综合 ⁄ 共 6348字 ⁄ 字号 评论关闭

原贴地址: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         

抱歉!评论已关闭.