1. 程式人生 > 實用技巧 >金蝶K3直接SQL報表實現動態行轉列報表

金蝶K3直接SQL報表實現動態行轉列報表

我們知道,在BOS開發中,想實現動態行轉列報表,可以使用交叉分析表來實現,但交叉分析表不太靈活,比如當動態列中有需要複雜的邏輯運算來實現時就無能為力了,下面介紹使用直接SQL報表來實現,也許能給你一點啟發。

以如下表資料為例,來說明如何實現:

要求實現這樣的報表樣式:

具體實現步驟如下:

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 @[email protected]+','+FSubject+'',@[email protected]+'+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 @[email protected]+'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'', '''[email protected]+''', '''[email protected]+''', '''[email protected]+''', '''[email protected]+''', 1, '''', 0, '''', '''', '''', 0, 0, ''0'', ''1'', ''{3AB197CF-443E-4555-B0F7-BD3971C50819}'', '''', '''', '''', -1, 1)'
ELSE
SET @[email protected]+'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'', '''[email protected]+''', '''[email protected]+''', '''[email protected]+''', '''[email protected]+''', 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

完畢,運用一下看看效果,是不是完美實現?舉一反三,親自動手做一個試試。