如何使用表达式在我的 SSRS 报告中显示 amalgamation/concentration 数据?
How can I display an amalgamation/concentration of data in my SSRS report using Expressions?
我在 SSRS 报告的 Tablix 中使用了多个相似的数据集(来自存储过程的数据)。我需要并排显示这些相似(在元数据中)但不同(在结果集数据中)存储过程的数据(在 Tablix 结果集的每一行中)。
对于给定的 ItemCode,从存储过程返回的数据将包含第 1 周值的记录和第 2 周值的另一条记录,但我需要并排显示这些; IOW,这样的数据:
ITEMCODE WEEK1 WEEK2
-------- ----- -----
1 11 0
. . .
1 0 42
2 7 0
. . .
2 0 8
...需要在报告中显示为:
ITEMCODE WEEK1 WEEK2
-------- ----- -----
1 11 42
2 7 8
根据回答 ,我尝试使用 "Week1" 和 "Week2" 数据字段的表达式来完成此操作:
第 1 周表达式:
=IIF((Fields!Week.Value="WK1"),Fields!Price.Value,"")
第 2 周表达式:
=IIf(Lookup(Fields!ItemCode.Value, Fields!ItemCode.Value, Fields!Week.Value, "RockBottomRollup_Craftworks")
="WK2", Lookup(Fields!ItemCode.Value, Fields!ItemCode.Value, Fields!Price.Value,
"RockBottomRollup_Craftworks"), "")
...但是使用这些表达方式我只听到第 2 周震耳欲聋的沉默(屏幕截图中的“5/22/2016 - 5/28-2016”列):
我需要做什么才能将第 1 周和第 2 周的行集中到每个 ItemCode 的单行中?
更新
我认为我需要做的是让 week2 的表达式不仅与 ItemCode 值相关联,而且与 Member 值相关联。
但是,作为 VBScript novice/doofus (sp?),我不知道需要什么语法才能实现。
我是否需要将第 2 周的表达式更改为如下内容:
=IIf(Lookup(Fields!ItemCode.Value AND Fields!Member.Value, Fields!ItemCode.Value, Fields!Week.Value,
"RockBottomRollup_Craftworks")
="WK2", Lookup(Fields!ItemCode.Value AND Fields!Member.Value, Fields!ItemCode.Value, Fields!Price.Value,
"RockBottomRollup_Craftworks"), "")
...或者...???
更新 2
我尝试了这个建议的表达式:
=IIf(Lookup(Fields!ItemCode.Value & " - " & Fields!ShortName.Value,Fields!ItemCode.Value & " - " & Fields!ShortName.Value,
Fields!Week.Value,"RockBottomRollup_Craftworks")
="WK2", Lookup(Fields!ItemCode.Value & " - " & Fields!ShortName.Value, Fields!ItemCode.Value & " - " & Fields!ShortName.Value,
Fields!Price.Value, "RockBottomRollup_Craftworks"), "")
...但在第 2 周列中仍然没有任何结果(报告的后半部分有该列的值 - 前半部分显示第 1 周的值,下半部分显示第 2 周的值)。
注意:我把"Member"换成了"ShortName",因为前者只是标签,后者才是实际的字段名。
和号 (&) 真的是正确的用法吗(相对于 "AND")?
更新 3
为此,我是否需要将同一数据集的第二个实例添加到报告中,为其命名,例如 "RockBottomRollup_Craftworks2",然后用该名称替换表达式中的现有数据集名称(附加"2")?
更新 4
我喜欢 Thomas Inzina 的发展方向;我现有的存储过程也是如此:
IF OBJECT_ID ( 'RockBottomAmalgamated', 'P' ) IS NOT NULL
DROP PROCEDURE RockBottomAmalgamated;
GO
CREATE PROC [dbo].[RockBottomAmalgamated]
@BegDate datetime,
@EndDate datetime,
@SortBy varchar(20)
AS
IF OBJECT_ID('#BaseCraftworksTable', 'U') IS NOT NULL
DROP TABLE #BaseCraftworksTable;
INSERT INTO #BaseCraftworksTable
EXEC sp_ViewPriceMatrix_Variance_RockBottomRollup_Craftworks
@BegDate = @BegDate
,@EndDate = @EndDate
,@SortBy = @SortBy;
SELECT * FROM #BaseCraftworksTable;
...需要改成这样:
IF OBJECT_ID ( 'RockBottomAmalgamated', 'P' ) IS NOT NULL
DROP PROCEDURE RockBottomAmalgamated;
GO
CREATE PROC [dbo].[RockBottomAmalgamated]
@BegDate datetime,
@EndDate datetime,
@SortBy varchar(20)
AS
IF OBJECT_ID('#BaseTable', 'U') IS NOT NULL
DROP TABLE #BaseTable;
INSERT INTO #BaseTable
EXEC sp_ViewPriceMatrix_Variance_RockBottomRollup_Craftworks
@BegDate = @BegDate
,@EndDate = @EndDate
,@SortBy = @SortBy;
SELECT #BaseTable.ItemCode, #BaseTable.Price, #BaseTable.Member, #BaseTable.Week, #BaseTable_1.Week as Week2
FROM #BaseTable
INNER JOIN #BaseTable AS #BaseTable_1 ON #BaseTable.ItemCode = #BaseTable_1.ItemCode
WHERE (((#BaseTable.Week)="wk1") AND ((#BaseTable_1.Week)="wk2"));
???
我不知道如何在不首先调用存储过程并将其返回的结果集插入临时 table 的情况下从存储过程 select 或一些这样的。
...或者...???
更新 5
受此 link[http://www.sommarskog.se/share_data.html] 的启发,我也尝试了这个(添加 "OUTPUT" 和 "BEGIN/COMMIT TRANSACTION" 块):
IF OBJECT_ID ( 'RockBottomAmalgamated', 'P' ) IS NOT NULL
DROP PROCEDURE RockBottomAmalgamated;
GO
CREATE PROCEDURE [dbo].[RockBottomAmalgamated]
@BegDate datetime,
@EndDate datetime,
@SortBy varchar(20) OUTPUT
AS
BEGIN TRANSACTION
INSERT INTO #BaseCraftworksTable
EXEC sp_ViewPriceMatrix_Variance_RockBottomRollup_Craftworks
@BegDate = @BegDate
,@EndDate = @EndDate
,@SortBy = @SortBy;
COMMIT TRANSACTION
SELECT * FROM #BaseCraftworksTable;
...但仍然没有返回结果。
根据您的更新,这可能有效但不确定,我需要重现您的环境:
=IIf(Lookup(Fields!ItemCode.Value & " - " & Fields!Member.Value,Fields!ItemCode.Value & " - " & Fields!Member.Value,
Fields!Week.Value,"RockBottomRollup_Craftworks")
="WK2", Lookup(Fields!ItemCode.Value & " - " & Fields!Member.Value, Fields!ItemCode.Value & " - " & Fields!Member.Value,
Fields!Price.Value, "RockBottomRollup_Craftworks"), "")
如果有帮助请告诉我。
假设您的存储过程的名称是 t。我会创建两个 SELECT 语句
SELECT t.ItemCode, t.Price, t.Member, t.Week as Week1 FROM t WHERE t.Week = 'Wk1'
第二个 SELECT 语句将使用 table 别名
SELECT t_1.Week as Week2 t as t_1 WHERE t_1.Week= 'Wk2'
接下来您将在 id 字段上加入两个 SELECT 语句
INNER JOIN t AS t_1 ON t.ItemCode = t_1.ItemCode
全部放在一起
SELECT t.ItemCode, t.Price, t.Member, t.Week, t_1.Week as Week2
FROM t
INNER JOIN t AS t_1 ON t.ItemCode = t_1.ItemCode
WHERE (((t.Week)="wk1") AND ((t_1.Week)="wk2"));
我在 SSRS 报告的 Tablix 中使用了多个相似的数据集(来自存储过程的数据)。我需要并排显示这些相似(在元数据中)但不同(在结果集数据中)存储过程的数据(在 Tablix 结果集的每一行中)。
对于给定的 ItemCode,从存储过程返回的数据将包含第 1 周值的记录和第 2 周值的另一条记录,但我需要并排显示这些; IOW,这样的数据:
ITEMCODE WEEK1 WEEK2
-------- ----- -----
1 11 0
. . .
1 0 42
2 7 0
. . .
2 0 8
...需要在报告中显示为:
ITEMCODE WEEK1 WEEK2
-------- ----- -----
1 11 42
2 7 8
根据回答
第 1 周表达式:
=IIF((Fields!Week.Value="WK1"),Fields!Price.Value,"")
第 2 周表达式:
=IIf(Lookup(Fields!ItemCode.Value, Fields!ItemCode.Value, Fields!Week.Value, "RockBottomRollup_Craftworks")
="WK2", Lookup(Fields!ItemCode.Value, Fields!ItemCode.Value, Fields!Price.Value,
"RockBottomRollup_Craftworks"), "")
...但是使用这些表达方式我只听到第 2 周震耳欲聋的沉默(屏幕截图中的“5/22/2016 - 5/28-2016”列):
我需要做什么才能将第 1 周和第 2 周的行集中到每个 ItemCode 的单行中?
更新
我认为我需要做的是让 week2 的表达式不仅与 ItemCode 值相关联,而且与 Member 值相关联。
但是,作为 VBScript novice/doofus (sp?),我不知道需要什么语法才能实现。
我是否需要将第 2 周的表达式更改为如下内容:
=IIf(Lookup(Fields!ItemCode.Value AND Fields!Member.Value, Fields!ItemCode.Value, Fields!Week.Value,
"RockBottomRollup_Craftworks")
="WK2", Lookup(Fields!ItemCode.Value AND Fields!Member.Value, Fields!ItemCode.Value, Fields!Price.Value,
"RockBottomRollup_Craftworks"), "")
...或者...???
更新 2
我尝试了这个建议的表达式:
=IIf(Lookup(Fields!ItemCode.Value & " - " & Fields!ShortName.Value,Fields!ItemCode.Value & " - " & Fields!ShortName.Value,
Fields!Week.Value,"RockBottomRollup_Craftworks")
="WK2", Lookup(Fields!ItemCode.Value & " - " & Fields!ShortName.Value, Fields!ItemCode.Value & " - " & Fields!ShortName.Value,
Fields!Price.Value, "RockBottomRollup_Craftworks"), "")
...但在第 2 周列中仍然没有任何结果(报告的后半部分有该列的值 - 前半部分显示第 1 周的值,下半部分显示第 2 周的值)。
注意:我把"Member"换成了"ShortName",因为前者只是标签,后者才是实际的字段名。
和号 (&) 真的是正确的用法吗(相对于 "AND")?
更新 3
为此,我是否需要将同一数据集的第二个实例添加到报告中,为其命名,例如 "RockBottomRollup_Craftworks2",然后用该名称替换表达式中的现有数据集名称(附加"2")?
更新 4
我喜欢 Thomas Inzina 的发展方向;我现有的存储过程也是如此:
IF OBJECT_ID ( 'RockBottomAmalgamated', 'P' ) IS NOT NULL
DROP PROCEDURE RockBottomAmalgamated;
GO
CREATE PROC [dbo].[RockBottomAmalgamated]
@BegDate datetime,
@EndDate datetime,
@SortBy varchar(20)
AS
IF OBJECT_ID('#BaseCraftworksTable', 'U') IS NOT NULL
DROP TABLE #BaseCraftworksTable;
INSERT INTO #BaseCraftworksTable
EXEC sp_ViewPriceMatrix_Variance_RockBottomRollup_Craftworks
@BegDate = @BegDate
,@EndDate = @EndDate
,@SortBy = @SortBy;
SELECT * FROM #BaseCraftworksTable;
...需要改成这样:
IF OBJECT_ID ( 'RockBottomAmalgamated', 'P' ) IS NOT NULL
DROP PROCEDURE RockBottomAmalgamated;
GO
CREATE PROC [dbo].[RockBottomAmalgamated]
@BegDate datetime,
@EndDate datetime,
@SortBy varchar(20)
AS
IF OBJECT_ID('#BaseTable', 'U') IS NOT NULL
DROP TABLE #BaseTable;
INSERT INTO #BaseTable
EXEC sp_ViewPriceMatrix_Variance_RockBottomRollup_Craftworks
@BegDate = @BegDate
,@EndDate = @EndDate
,@SortBy = @SortBy;
SELECT #BaseTable.ItemCode, #BaseTable.Price, #BaseTable.Member, #BaseTable.Week, #BaseTable_1.Week as Week2
FROM #BaseTable
INNER JOIN #BaseTable AS #BaseTable_1 ON #BaseTable.ItemCode = #BaseTable_1.ItemCode
WHERE (((#BaseTable.Week)="wk1") AND ((#BaseTable_1.Week)="wk2"));
???
我不知道如何在不首先调用存储过程并将其返回的结果集插入临时 table 的情况下从存储过程 select 或一些这样的。 ...或者...???
更新 5
受此 link[http://www.sommarskog.se/share_data.html] 的启发,我也尝试了这个(添加 "OUTPUT" 和 "BEGIN/COMMIT TRANSACTION" 块):
IF OBJECT_ID ( 'RockBottomAmalgamated', 'P' ) IS NOT NULL
DROP PROCEDURE RockBottomAmalgamated;
GO
CREATE PROCEDURE [dbo].[RockBottomAmalgamated]
@BegDate datetime,
@EndDate datetime,
@SortBy varchar(20) OUTPUT
AS
BEGIN TRANSACTION
INSERT INTO #BaseCraftworksTable
EXEC sp_ViewPriceMatrix_Variance_RockBottomRollup_Craftworks
@BegDate = @BegDate
,@EndDate = @EndDate
,@SortBy = @SortBy;
COMMIT TRANSACTION
SELECT * FROM #BaseCraftworksTable;
...但仍然没有返回结果。
根据您的更新,这可能有效但不确定,我需要重现您的环境:
=IIf(Lookup(Fields!ItemCode.Value & " - " & Fields!Member.Value,Fields!ItemCode.Value & " - " & Fields!Member.Value,
Fields!Week.Value,"RockBottomRollup_Craftworks")
="WK2", Lookup(Fields!ItemCode.Value & " - " & Fields!Member.Value, Fields!ItemCode.Value & " - " & Fields!Member.Value,
Fields!Price.Value, "RockBottomRollup_Craftworks"), "")
如果有帮助请告诉我。
假设您的存储过程的名称是 t。我会创建两个 SELECT 语句
SELECT t.ItemCode, t.Price, t.Member, t.Week as Week1 FROM t WHERE t.Week = 'Wk1'
第二个 SELECT 语句将使用 table 别名
SELECT t_1.Week as Week2 t as t_1 WHERE t_1.Week= 'Wk2'
接下来您将在 id 字段上加入两个 SELECT 语句
INNER JOIN t AS t_1 ON t.ItemCode = t_1.ItemCode
全部放在一起
SELECT t.ItemCode, t.Price, t.Member, t.Week, t_1.Week as Week2
FROM t
INNER JOIN t AS t_1 ON t.ItemCode = t_1.ItemCode
WHERE (((t.Week)="wk1") AND ((t_1.Week)="wk2"));