如何使用表达式在我的 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"));