我使用多个类似的数据集(来自存储过程的数据),我在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”专栏):
我需要做些什么才能将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"), "")
...或... ???
我试过这个建议表达式:
=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”相对)?
为此,我是否需要将相同数据集的第二个实例添加到报表中,命名它,例如“RockBottomRollup_Craftworks2”,然后用表达式替换表达式中的现有数据集名称(附加“2”) )?
我喜欢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"));
???
我不知道如何在不首先调用存储过程并将其返回的结果集插入临时表或其他类似的情况下从存储过程中选择(如托马斯的答案所示)。 ... ...或???
受此链接[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;
...但仍未返回任何结果。
答案 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"));