如何在Crystal Reports for Visual Studio中使用动态列实现数据透视报表?

时间:2016-06-17 22:08:04

标签: c# sql-server stored-procedures crystal-reports pivot

我有一个存储过程(SQL),使用动态列进行数据透视查询。一些查询生成2列或更多列,它们都取决于参数。如何使用此动态列数据透视在 Visual Studio (C#或VB)的 Crystal Reports 中实现报告

2 个答案:

答案 0 :(得分:0)

这可以做到。以下是一个例子。

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)

答案 1 :(得分:0)

我可以解决这个问题,这就是我为未来类似问题做的事情:

  • 首先。我的存储过程使用带有动态列的数据透视表进行查询。我不得不从查询中删除数据,因此只选择包含大量行的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 Reports进行研究,当您从Crystal Report创建报表时,您必须选择一个助手。我选择交叉表
  • 最后,在选择我的存储过程(没有数据透视)后,在交叉表助手中,您必须添加摘要来自生成我的存储过程的字段的字段。几乎就像编码枢轴一样。

    ____________ 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

这是一个美丽的报告,如透视查询。