如何使用表达式在我的SSRS报告中显示合并/集中数据?

时间:2016-06-08 16:38:02

标签: sql-server reporting-services vbscript rdl

我使用多个类似的数据集(来自存储过程的数据),我在SSRS报告的Tablix中使用。我需要并排显示来自这些相似的数据 - (在元数据中) - 但不同(在结果集数据中)存储过程(在Tablix中的结果集的每一行中)。

从存储过程返回的数据将包含第1周值的记录,以及给定ItemCode的第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

基于答案here,我尝试使用表达式为“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”专栏):

enter image description here

我需要做些什么才能将week1和week2行集中到每个ItemCode的单行中?

更新

我认为我需要做的是将第2周的表达式不仅绑定到ItemCode值,还绑定到Member值。

但是,作为VBScript新手/ 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"));

???

我不知道如何在不首先调用存储过程并将其返回的结果集插入临时表或其他类似的情况下从存储过程中选择(如托马斯的答案所示)。 ... ...或???

更新5

受此链接[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;

...但仍未返回任何结果。

2 个答案:

答案 0 :(得分:1)

根据您的更新,这可能有效,但不确定,我需要重现您的环境:

SELECT ...
FROM tableA
WHERE id IN (
   SELECT id from tableB...
   UNION ALL <---note this
   SELECT id from tableC...
)

如果有帮助,请告诉我。

答案 1 :(得分:1)

让我们说你的存储过程的名字是t。我会创建两个SELECT语句

  

SELECT t.ItemCode,t.Price,t.Member,t.Week as Week1 FROM t WHERE t.Week =&#39; Wk1&#39;

第二个SELECT语句将使用表别名

  

选择t_1。周为周二为t_1在哪里t_1.Week =&#39; Wk2&#39;

接下来,您在id字段

上加入两个SELECT语句
  

INNER JOIN t 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"));