如何在交叉表中显示行号?

How can I display Row Number in Cross-Tab?

我正在寻找一种在交叉表中显示行号的方法。

我尝试在网上搜索有关如何操作的答案,但没有找到任何有用的信息。 所以我求助于 Stack Overflow 上的好人。 我想这样做的原因,如果可能的话,是因为我开始工作的公司中的许多客户要求在交叉表中有一个行号。 我正在使用 Visual Studio 2013 和 Crystal 报告。 那么在 Crystal 报告中是否有任何基本(简单)的方法来做到这一点?

例如,我有一个显示计量单位和金额的交叉表。

https://imgur.com/a/lOjCq

但我希望我的交叉表是这样的:

             Amount
1. Total        -38

2. KG 

3. kut            9

4. LIT.           4

5. m            -32

6. proc

7. Koм          -19

请记住,我这周才开始使用 Crystal 报告,所以这对我来说是全新的。而且图中的交叉表只是我随便做的一个,用来说明我需要的。

提前谢谢你。

为了在交叉表中显示行号,您需要先将行号放入将数据发送到报表的存储过程中。

为了更好地理解它,我将首先向您展示我的数据的外观,然后再添加行号(图 1)。

代码:

select 
     a.S_ID as ID,
     osn.sifra as BasicGoodsCode,
     osn.naziv as BasicGoods,
     null,
     a.RobaSifra as GoodsCode,
     a.Roba as Goods,
     a.Detalj as Detail,
     a.DetaljDodatak as DetailsAddon
from NP_Stavke s
     left join RobaGrupe osn on osn.id = s.RobaId
     left join #A a on a.S_ID = s.Id
order by BasicGoodsCode, ID

Pic 1: As you can see I have 3 different Ids for BasicGoods which means that I have 3 Rows in my CrossTab

列 ID、BasicGoodsCode 和 BasicGoods 将成为我的交叉表中的行。

DetailsAddon 列中的值将成为我在 CrossTab 中的列。

GoodsCode、Goods 和 Detail 列将成为我的 CrossTab 中的值。

专栏文章不重要。

现在您已经了解了所有内容,我们可以从向交叉表添加行号开始。

第 1 步:

您需要做的第一件事是在存储过程中的 table 中添加一个行号。 为此,我使用了 DENSE_RANK() 根据您的数据,您可能需要使用 ROW_NUMBER() 甚至其他东西。我使用 DENSE_RANK() 因为我需要在 S_ID 更改后更改我的行号。

代码:

select 
     a.S_ID as ID,
     DENSE_RANK() OVER (ORDER BY osn.sifra, s.Id asc) as BasicGoodsRowNo, // THIS IS ADDED
     osn.sifra as BasicGoodsCode,
     osn.naziv as BasicGoods,
     null as Pieces,
     a.RobaSifra as GoodsCode,
     a.Roba as Goods,
     a.Detalj as Detail,
     a.DetaljDodatak as DetailsAddon
from NP_Stavke s
     left join RobaGrupe osn on osn.id = s.RobaId
     left join #A a on a.S_ID = s.Id
order by BasicGoodsCode, ID

让我们看看我们的数据现在的样子(Pic 2)

如您所见,我们添加了一个行号,该行号会在 Id 更改时更改。

重要提示: 您在报告中使用的 DataTable 中的行号必须是整数或小数,否则将无法正常工作。

第 2 步:

我们已经完成了 'hard' 部分,现在是时候将行号放入我们的交叉表中了。

当您创建一个交叉表或右键单击交叉表然后单击 'Cross-Tab Expert...' 时,它将打开一个 window,如 this one,您将在其中的行部分插入您的行号列(在我的例子中,正如您在上面的代码中看到的,我的行号列的名称是 'BasicGoodsRowNo')。

第 3 步:

因为您不想只在报告中显示行号,请左键单击您的行,然后单击 'Group Options...'(Pic 4)

一旦新的 window 出现,点击 'Options' 选项卡然后选中 'Customise group name field' 然后点击 'Use a formula as group name' 然后点击 'x-2'(Pic 5)

第 4 步:

输入这样的公式:

toText( {myTbl.BasicGoodsRowNo}, 0, "" ) + '. ' + {myTbl.BasicGoodsCode} + ' ' + {myTbl.BasicGoods}

当然你的公式不会和我的完全一样,因为你不会有和我一样的列。您必须拥有的此公式的唯一部分是 toText( {myTbl.BasicGoodsRowNo}, 0, "" ) 而不是 {myTbl.BasicGoodsRowNo} 你将把你的行号列。你将需要 toText,因为如果你没有它并且你想在你的行号之后显示一个字符串,它会给你一个错误,因为 RowNumber 是一个整数字段。

GJ 大功告成,其实并不难

How My CrossTab looks once RowNumber is added

现在有一种方法可以简化这个过程,那就是:

第 1 步:

在您的存储过程中创建 2 列。一个将显示行号,另一个将显示将显示为交叉表行的值。

代码:

select 
      a.S_ID as ID,
      DENSE_RANK() OVER (ORDER BY osn.sifra, s.Id asc) as BasicGoodsRowNo, // RowNumber
      CONVERT(varchar(10), DENSE_RANK() OVER (ORDER BY osn.sifra, s.Id asc)) + '. ' + osn.sifra + ' ' +osn.naziv as BasicGoods, // Value that will be displayed in CrossTab Row
      null as Pieces,
      a.RobaSifra as GoodsCode,
      a.Roba as Goods,
      a.Detalj as Detail,
      a.DetaljDodatak as DetailsAddon
from NP_Stavke s
      left join RobaGrupe osn on osn.id = s.RobaId
      left join #A a on a.S_ID = s.Id
order by BasicGoods, ID

如您所见,列 BasicGoodsRowNo 没有更改,仍将显示与以前相同的值,我已删除列 BasicGoodsCode 和 BasicGoods 并用此替换它们

CONVERT(varchar(10), DENSE_RANK() OVER (ORDER BY osn.sifra, s.Id asc)) + '. ' + osn.sifra + ' ' +osn.naziv as BasicGoods,

BasicGoods 列将显示 BasicGoodsRowNo + BasicGoodsCode + BasicGoods。

第 2 步:

第二步同前

第 3 步:

单击行和 'Group Options' 后,再次转到 'Options' 选项卡,然后再次选中 'Customise group name field' 复选框,然后单击 'Use a formula as group name' 单击 'Choose from existing field' 并从组合框 select 中选择要在交叉表中显示为行值的列。在我的例子中是 'BasicGoods' 列 (Pic 7).

我使用了第一种方法,因为根据用户的决定,我可能根本不显示 CrossTab,也可能不显示 BasicGoods,但如果您的报告中只有 CrossTab,您可以使用第二种,更短更简单的方法。

如果您有任何问题,请随时提问。