请选择 进入手机版 | 继续访问电脑版
风雨十年,感恩同行

[共享] 金蝶K3麦枫版全功能60站点软注册用SQL报表实现动态行转列报表的方法

[复制链接]
发表于 2019-1-10 09:01:41 | 显示全部楼层 |阅读模式

我们知道,在BOS开发中,想实现动态行转列报表,可以使用交叉分析表来实现,但交叉分析表不太灵活,比如当动态列中有需要复杂的逻辑运算来实现时就无能为力了,下面介绍使用直接SQL报表来实现,也许能给你一点启发。

以如下表数据为例,来说明如何实现:

1.jpg

要求实现这样的报表样式:


2.jpg


具体实现步骤如下:

1、使用以下存储过程随便建一个直接SQL报表「测试行列转换报表」。

CREATE   Procedure   sp_Rpt_Test
AS
SET NOCOUNT ON

SELECT FUserName 姓名,FSubject 学科,FScore 分数 FROM t_Test

SET NOCOUNT OFF

GO

2、使用如下SQL语句在数据库中找到此SQL报表的ID。

select FReportID,* from ICClassSQLReport where FName_CHS ='测试行列转换报表'

3、修改创建此SQL报表的存储过程,注意将下面语句中的「3AB197CF-443E-4555-B0F7-BD3971C50819」这个UUID替换为第二步中你自己的SQL报表的「FReportID」:

ALTER   Procedure   sp_Rpt_Test
AS
SET NOCOUNT ON

DECLARE @vSQL VARCHAR(MAX)
DECLARE @vColumn VARCHAR(MAX)
DECLARE @vSumColumn VARCHAR(MAX)

SET @vSQL=''
SET @vColumn=''
SET @vSumColumn=''

SELECT @vColumn=@vColumn+','+FSubject+'',@vSumColumn=@vSumColumn+'+ISnull(['+FSubject+'],0)'
FROM t_Test GROUP BY FSubject ORDER BY FSubject

SET @vSQL='SELECT *,'+STUFF(@vSumColumn,1,1,'')+' [总分数] INTO t_Rpt_Test FROM(
    SELECT FUserName 姓名,FSubject,FScore FROM t_Test ) t
    PIVOT(SUM(FScore) FOR FSubject IN('+STUFF(@vColumn,1,1,'')+')) tt'

EXEC(@vSQL)

DECLARE @FSequence INT
DECLARE @FValue VARCHAR(50)
SET @vSQL=''
DELETE ICClassSQLReportDesc WHERE FReportID='3AB197CF-443E-4555-B0F7-BD3971C50819'
DECLARE t_Cur CURSOR FOR select FSequence,FValue from dbo.fn_SplitStringToTable('姓名'+ @vColumn +',总分数',',')
OPEN t_Cur
FETCH NEXT FROM t_Cur INTO @FSequence,@FValue   
WHILE(@@FETCH_STATUS=0)
BEGIN
    IF @FSequence=1
    SET @vSQL=@vSQL+'insert into ICClassSQLReportDesc ( FCanInput,FColCaption_CHS,FColCaption_CHT,FColCaption_EN,FColName,FColType,FCondition,FContrlExt,FDSPFieldName,FFNDFieldName,FFormat,FLookUpClassID,FLookUpType,FMustInput,FNeedFilter,FReportID,FSRCFieldName,FSRCTableName,FSRCTableNameAs,FTableID,FVisible ) values
                (''1'',  '''+@FValue+''',  '''+@FValue+''',  '''+@FValue+''',  '''+@FValue+''',  1,  '''',  0,  '''',  '''',  '''',  0,  0,  ''0'',  ''1'',  ''{3AB197CF-443E-4555-B0F7-BD3971C50819}'',  '''',  '''',  '''',  -1,  1)'
    ELSE
    SET @vSQL=@vSQL+'insert into ICClassSQLReportDesc ( FCanInput,FColCaption_CHS,FColCaption_CHT,FColCaption_EN,FColName,FColType,FCondition,FContrlExt,FDSPFieldName,FFNDFieldName,FFormat,FLookUpClassID,FLookUpType,FMustInput,FNeedFilter,FReportID,FSRCFieldName,FSRCTableName,FSRCTableNameAs,FTableID,FVisible ) values
                (''1'',  '''+@FValue+''',  '''+@FValue+''',  '''+@FValue+''',  '''+@FValue+''',  3,  '''',  0,  '''',  '''',  '''',  0,  0,  ''0'',  ''1'',  ''{3AB197CF-443E-4555-B0F7-BD3971C50819}'',  '''',  '''',  '''',  -1,  1)'
   
    FETCH NEXT FROM t_Cur INTO @FSequence,@FValue   
END
CLOSE t_Cur
DEALLOCATE t_Cur

EXEC(@vSQL)

SELECT * FROM t_Rpt_Test

DROP TABLE t_Rpt_Test

SET NOCOUNT OFF

GO

完毕,运用一下看看效果,是不是完美实现?举一反三,扩展一下思维,还有实现不了的报表吗?!


金蝶K3麦枫版全功能60站点软注册文件下载,下载包百度网盘地址含安装包和教程

金蝶K3麦枫版全功能60站点软注册.rar (444 Bytes, 下载次数: 45)

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:592439202

服务时间 9:00-22:00

金蝶用友易助管家婆深度服务
 
QQ在线咨询
售前咨询热线
592439202
售后服务热线
243998158
快速回复 返回顶部 返回列表