金蝶K3直接SQL報表實現動態行轉列報表
阿新 • • 發佈:2020-10-14
我們知道,在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
完畢,運用一下看看效果,是不是完美實現?舉一反三,親自動手做一個試試。