为了在您的交叉表中显示行号,您需要首先将行号放入将数据发送到报表的存储过程中。
为了更好地理解它,我将首先向您展示我的数据在添加行号之前的外观(图 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 将成为我的 CrossTab 中的行。
DetailsAddon 列中的值将成为我在 CrossTab 中的列。
GoodsCode、Goods 和 Detail 列将成为我的 CrossTab 中的值。
柱子并不重要。
现在您已经了解了所有内容的外观,我们可以从向 CrossTab 添加行号开始。
第 1 步:
您需要做的第一件事是在存储过程的表中添加行号。
为此,我使用了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 的变化而变化。
重要提示: 您在报告中使用的数据表中的行号必须是整数或小数,否则将无法正常工作。
第 2 步:
我们已经完成了“困难”部分,现在是时候将行号放入我们的 CrossTab 中了。
当您创建 CrossTab 或右键单击 CrossTab 然后单击“Cross-Tab Expert...”时,它将打开一个类似 this one 的窗口,并在其中的“行”部分中插入行号列(就我而言,正如您在上面的代码中看到的,我的行号列的名称是“BasicGoodsRowNo”)。
第 3 步:
由于您不想在报告中仅显示行号,请左键单击您的行,然后单击“组选项...”(Pic 4)
出现新窗口后,点击“选项”选项卡,然后选中“自定义组名字段”,然后点击“使用公式作为组名”,然后点击“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 列。一个将显示行号,另一个将显示将显示为 CrossTab 行的值。
代码:
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 步:
第 2 步与之前相同。
第 3 步:
单击行并单击“组选项”后,再次转到“选项”选项卡,然后再次选中“自定义组名称字段”复选框,然后单击 “使用公式作为组名称' 点击“从现有字段中选择”,然后从组合框中选择要在交叉表中显示为行值的列。在我的案例中是“基本商品”列 (Pic 7)。
我使用第一种方法,因为根据用户的决定,我可能根本不会显示 CrossTab,也可能不会显示 BasicGoods,但如果您的报告中只有 CrossTab,您可以使用第二种更短、更简单的方法.
如果您有任何问题,请随时提出。