交叉报表处理实例

原创 2005年05月31日 16:21:00

两种比较特殊的交叉数据报表处理

--示例数据:
CREATE TABLE tb(ID varchar(10),NGNO char(1),QTY int)
INSERT tb SELECT '200505','A',10
UNION ALL SELECT '200505','B',20
UNION ALL SELECT '200505','C',30
UNION ALL SELECT '200506','B',10
UNION ALL SELECT '200506','C',20
UNION ALL SELECT '200506','D',30
UNION ALL SELECT '200506','E',40
GO

交叉数据报表要求1:
    按ID列分组,将NGNO列水平显示为多列,但每列由NGNO的大小顺序决定,而不是由NGNO的值决定,对于示例数据,最终的结果要求如下:

ID         col1    col2    col3    col4
---------- ------- ------- ------- -------
200505     A(10)   B(20)   C(30)   
200506     B(10)   C(20)   D(30)   E(40)

--实现代码
DECLARE @i varchar(10),@s nvarchar(4000)
SELECT TOP 1 @s='',@I=COUNT(*) FROM tb
GROUP BY ID
ORDER BY COUNT(*) DESC
WHILE @i>0
SELECT @s=N',col'+@i
        +N'=ISNULL(MAX(CASE GID WHEN '+@i
        +N' THEN QTY END),'''')'+@s,
    @i=@i-1
EXEC(N'SELECT ID'+@s+N'
FROM(
    SELECT ID,QTY=RTRIM(NGNO)+QUOTENAME(QTY,N''()''),
    GID=(SELECT COUNT(DISTINCT NGNO) FROM TB WHERE ID=a.ID AND NGNO<=a.NGNO)
    FROM tb a
)a GROUP BY ID')
GO

交叉数据报表要求2:
    按ID列分组,将NGNO及QTY列合并显示在一个列中,最终的结果要求如下:

ID         Value
---------- -----------------------------------------------
200505     A(10)        B(20)        C(30)
200506     B(10)        C(20)        D(30)        E(40)

(所影响的行数为 2 行)

--实现处理的函数
CREATE FUNCTION f_Str(@ID varchar(10))
RETURNS varchar(8000)
AS
BEGIN
    DECLARE @r varchar(8000)
    SET @r=''
    SELECT @r=@r+SPACE(8)+RTRIM(NGNO)+QUOTENAME(QTY,'()')
    FROM tb
    WHERE ID=@ID
    RETURN(STUFF(@r,1,8,''))
END
GO

--调用实现查询
SELECT ID,Value=dbo.f_Str(ID) FROM tb GROUP BY ID
GO

原帖地址

相关文章推荐

birt 交叉报表动态列实例

  • 2014年11月17日 11:26
  • 36KB
  • 下载

双区间交叉报表的实现办法(实例)

使用Jasper或BIRT等报表工具时,常会碰到一些非常规的统计,用报表工具本身或SQL都难以处理,比如交叉表的行组和列组都是分段区间,测度(measurem)来自其他数据库表。集算器具有结构化强计算...

ireport+jasperreport 直接输出到打印机 普通报表 交叉报表

项目中要用到针式打印机票据打印,本来是使用java printable 通过 Graphic2D输出到图形化方式打印的,运行了一段时间客户对版面个性需要比较多,用输出图形的方式调整太麻烦,而且Grap...

2个交叉报表,简单的demo

  • 2009年01月07日 17:11
  • 119KB
  • 下载

交叉报表的简单制作

  • 2015年05月08日 17:45
  • 31KB
  • 下载

双区间交叉报表的制作

使用Jasper或BIRT等报表工具时,常会碰到一些非常规的统计,用报表工具本身或SQL都难以处理,比如交叉表的行组和列组都是分段区间,测度(measurem)来自其他数据库表。集算器具有结构化强计算...

ireport开发交叉报表资料及笔记

  • 2009年08月04日 14:10
  • 655KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:交叉报表处理实例
举报原因:
原因补充:

(最多只允许输入30个字)