2

嗨,这将是一个非常奇怪的问题,我的所有搜索都没有得到好的答案。基本问题将帮助我解决两个问题,一个在 Crystal Reports 中,一个在 SSRS 2005 中。我有两个需要相同解决方案的报表。请耐心等待,因为解释会有点冗长。

我需要以一种不寻常的方式使用 SSRS。我需要创建的报告将只有最少的数据,并且将在现场打印和手动填写。在这种情况下,它们被用作表单打印程序。

报告将有一个 tablix/Matrix 控件,我需要使用特定的列数来创建它,无论这些列是否存在数据。在一种情况下(SSRS),没有任何字段被用作将被求和的数据字段。

我有行和列的数据,但我需要创建 10 列的矩阵/tablix。因此,如果记录集只有 2 个构成列的数据实例,我仍然希望看到所有 10 列,但标题为空白。

所以它看起来像这样:

                         Col1|Col2|Col3|Fake1|Fake2|Fake3|......
Row1
Row2
Row3
.....

因此,如果我有 1 列或 10 列的数据,我仍然希望显示 10 列,其中 2 列带有真实标题,8 列带有空白标题。

这是我正在使用的 SQL。这是 SSRS 2005 中矩阵的基础。员工 ID 和姓名是行。JobAccount_Tracking_ID 是列。一条记录可以有 1 到 10 个 tracking_id。

我要返回的是总共 10 个跟踪 ID,而不管实际跟踪 ID 的数量是多少。额外内容将在矩阵中显示为空白列。

Declare @FieldLogID as int
Set @FieldLogID = 1018

SELECT DISTINCT
CustomizedFieldLogEmployee_1.Employee_EmployeeID, 
CustomizedFieldLogEmployee_1.Employee_FullName, 
CustomizedFieldLogEmployee_1.Injured_Today_Custom, 
CustomizedFieldLogJobAccount_1.JobAccount_TrackingID, 
CustomizedFieldLogEmployee_1.StartDateTime, 
CustomizedFieldLogEmployee_1.StopDateTime, 
CustomizedFieldLogEmployee_1.WorkHours
FROM
CustomizedFieldLogEmployee AS CustomizedFieldLogEmployee_1 LEFT OUTER JOIN CustomizedFieldLogJobAccount AS CustomizedFieldLogJobAccount_1 
ON CustomizedFieldLogEmployee_1.FieldLog_FieldLogID = CustomizedFieldLogJobAccount_1.FieldLog_FieldLogID
WHERE CustomizedFieldLogEmployee_1.FieldLog_FieldLogID = @FieldLogID

任何想法我怎么能做到这一点?在 SSRS 案例中,我无法在数据库中创建视图,因为它是供应商的数据库。

4

1 回答 1

0

所以这是逻辑:

  1. 将主查询联合到包含 10 个附加联合的子查询(假设最大值为 10)。10 个工会将使用虚假的 TrakingID。zzz01 到 zzz10 在这种情况下确保它们在排序中显示在最后。如果 TrackingID 是整数,请使用 9999990 到 9999999。
  2. 将整个内容包含在一个外部查询中,该查询使用诸如 Row_Number() 之类的排名函数通过在 userID 上对行进行分区并在 TrackingID 上排序来对行进行排名。zzz 或 999999 将确保假货排在最后。
  3. 将整个内容再次包含在另一个外部查询中,该查询使用 where 子句中的排名函数来获取前 10 个。这将为您提供现有的跟踪 id 以及剩余的最多 10 个假的。

这是代码:

Declare @FieldLogID as int
Set @FieldLogID = 1018

Select Employee_EmployeeID,
Employee_FullName,
Injured_Today_Custom,
Case when JobAccount_TrackingID like'zzz%' then Null else JobAccount_TrackingID end as JobAccount_TrackingID,
StartDateTime, 
StopDateTime, 
WorkHours
from 
(
Select row_number() over (partition by Employee_EmployeeID order by JobAccount_TrackingID) row,*
from 
(
SELECT DISTINCT
CustomizedFieldLogEmployee_1.Employee_EmployeeID, 
CustomizedFieldLogEmployee_1.Employee_FullName, 
CustomizedFieldLogEmployee_1.Injured_Today_Custom, 
CustomizedFieldLogJobAccount_1.JobAccount_TrackingID, 
CustomizedFieldLogEmployee_1.StartDateTime, 
CustomizedFieldLogEmployee_1.StopDateTime, 
CustomizedFieldLogEmployee_1.WorkHours
FROM
CustomizedFieldLogEmployee AS CustomizedFieldLogEmployee_1 LEFT OUTER JOIN CustomizedFieldLogJobAccount AS CustomizedFieldLogJobAccount_1 
ON CustomizedFieldLogEmployee_1.FieldLog_FieldLogID = CustomizedFieldLogJobAccount_1.FieldLog_FieldLogID
WHERE CustomizedFieldLogEmployee_1.FieldLog_FieldLogID = @FieldLogID
Union
Select Distinct 
Employee_EmployeeID,
Employee_FullName,
null as Injured_Today_Custom,
fake_TrackingID,
null as StartDateTime, 
null as StopDateTime, 
null as WorkHours
FROM
CustomizedFieldLogEmployee
cross join
(
Select 'zzz01' fake_TrackingID
union Select 'zzz02' 
union Select 'zzz03' 
union Select 'zzz04' 
union Select 'zzz05' 
union Select 'zzz06' 
union Select 'zzz07' 
union Select 'zzz08' 
union Select 'zzz09' 
union Select 'zzz10' 
) a where FieldLog_FieldLogID = @FieldLogID
) b 
) c where Row<=10 
order by Employee_EmployeeID,JobAccount_TrackingID
于 2012-08-30T04:42:34.780 回答