如何在 Visual Studio 的 Crystal 报告中实现具有动态列的数据透视报告?
How do I achieve a pivot report with a dynamic columns in Crystal Reports for Visual Studio?
我有一个存储过程 (SQL),它是通过 pivot 查询和 动态列 创建的。一些查询生成 2 个或更多列,这完全取决于参数。如何在 Crystal Reports 中实现 report for Visual Studio ( C# 或 VB) 与此动态列枢轴?
这是可以做到的。下面是一个例子。
DECLARE @ColumnString varchar(200),
@sql varchar(1000)
CREATE TABLE #ColumnValue
(
Value varchar(500)
)
INSERT INTO #ColumnValue (Value)
SELECT DISTINCT '[' + 'value' + Convert(Varchar(20),ROW_NUMBER() Over(Partition by id Order by id )) + ']'
FROM Test
SELECT @ColumnString = COALESCE(@ColumnString + ',', '') + Value
FROM #ColumnValue
Drop table #ColumnValue
SET @sql =
'
SELECT *
FROM
(
SELECT
id,name,val,''value'' + Convert(Varchar(20),ROW_NUMBER() Over(Partition by id Order by id ))as [values]
FROM Test
) AS P
PIVOT
(
MAX(val) FOR [values] IN ('+@ColumnString+')
) AS pv
'
--print @sql
EXEC (@sql)
我可以解决这个问题,这就是我解决以后类似问题的方法:
- 首先。我的存储过程使用带有动态列的数据透视表进行查询。我不得不 从我的查询中删除数据透视表 ,所以只有 select 3 个相同的列有很多行。
结果(没有主元)是这样的:
ClaveLMG Calificacion Resultado
i7p-TP2 P1_1Excelente 100.0
i7p-TP2 P1_2Bueno 0.0
i7p-TP2 P1_3Regular 0.0
i7p-TP2 P1_4Malo 0.0
78-BD1 P1_1Excelente 100.0
78-BD1 P1_2Bueno 0.0
78-BD1 P1_3Regular 0.0
78-BD1 P1_4Malo 0.0
41-TP2 P1_1Excelente 100.0
41-TP2 P1_2Bueno 0.0
41-TP2 P1_3Regular 0.0
41-TP2 P1_4Malo 0.0
42-TC2 P1_1Excelente 100.0
42-TC2 P1_2Bueno 0.0
42-TC2 P1_3Regular 0.0
42-TC2 P1_4Malo 0.0
- 正在研究如何使用 Crystal 报告,当您从 Crystal 报告创建报告时,您必须 select 一个助手。我 select 交叉表.
最后,在 select 我的存储过程(没有数据透视表)之后,在交叉表助手中,你必须添加 rows, 列 和 摘要字段 来自生成我的存储过程的字段。几乎就像编写数据透视表一样。
____________ i7p-TP2 78-BD1 41-TP2 42-TC2
P1_1Excelente 100.000000 100.000000 100.000000 100.000000
P1_2Bueno 0.000000 0.000000 0.000000 0.000000
P1_3Regular 0.000000 0.000000 0.000000 0.000000
P1_4Malo 0.000000 0.000000 0.000000 0.000000
结果是一个像数据透视表查询一样漂亮的报告。
我有一个存储过程 (SQL),它是通过 pivot 查询和 动态列 创建的。一些查询生成 2 个或更多列,这完全取决于参数。如何在 Crystal Reports 中实现 report for Visual Studio ( C# 或 VB) 与此动态列枢轴?
这是可以做到的。下面是一个例子。
DECLARE @ColumnString varchar(200),
@sql varchar(1000)
CREATE TABLE #ColumnValue
(
Value varchar(500)
)
INSERT INTO #ColumnValue (Value)
SELECT DISTINCT '[' + 'value' + Convert(Varchar(20),ROW_NUMBER() Over(Partition by id Order by id )) + ']'
FROM Test
SELECT @ColumnString = COALESCE(@ColumnString + ',', '') + Value
FROM #ColumnValue
Drop table #ColumnValue
SET @sql =
'
SELECT *
FROM
(
SELECT
id,name,val,''value'' + Convert(Varchar(20),ROW_NUMBER() Over(Partition by id Order by id ))as [values]
FROM Test
) AS P
PIVOT
(
MAX(val) FOR [values] IN ('+@ColumnString+')
) AS pv
'
--print @sql
EXEC (@sql)
我可以解决这个问题,这就是我解决以后类似问题的方法:
- 首先。我的存储过程使用带有动态列的数据透视表进行查询。我不得不 从我的查询中删除数据透视表 ,所以只有 select 3 个相同的列有很多行。
结果(没有主元)是这样的:
ClaveLMG Calificacion Resultado
i7p-TP2 P1_1Excelente 100.0
i7p-TP2 P1_2Bueno 0.0
i7p-TP2 P1_3Regular 0.0
i7p-TP2 P1_4Malo 0.0
78-BD1 P1_1Excelente 100.0
78-BD1 P1_2Bueno 0.0
78-BD1 P1_3Regular 0.0
78-BD1 P1_4Malo 0.0
41-TP2 P1_1Excelente 100.0
41-TP2 P1_2Bueno 0.0
41-TP2 P1_3Regular 0.0
41-TP2 P1_4Malo 0.0
42-TC2 P1_1Excelente 100.0
42-TC2 P1_2Bueno 0.0
42-TC2 P1_3Regular 0.0
42-TC2 P1_4Malo 0.0
- 正在研究如何使用 Crystal 报告,当您从 Crystal 报告创建报告时,您必须 select 一个助手。我 select 交叉表.
最后,在 select 我的存储过程(没有数据透视表)之后,在交叉表助手中,你必须添加 rows, 列 和 摘要字段 来自生成我的存储过程的字段。几乎就像编写数据透视表一样。
____________ i7p-TP2 78-BD1 41-TP2 42-TC2 P1_1Excelente 100.000000 100.000000 100.000000 100.000000 P1_2Bueno 0.000000 0.000000 0.000000 0.000000 P1_3Regular 0.000000 0.000000 0.000000 0.000000 P1_4Malo 0.000000 0.000000 0.000000 0.000000
结果是一个像数据透视表查询一样漂亮的报告。