2

こんにちはこれはすべて非常に奇妙な質問になるでしょう、そして私の検索はすべて良い答えをもたらしませんでした。基本的な問題は、CrystalReportsとSSRS2005の2つの問題を解決するのに役立ちます。両方に同じ種類の解決策が必要なレポートがあります。説明が少し長くなりますので、ご容赦ください。

SSRSを通常とは異なる方法で使用する必要があります。私が作成する必要のあるレポートには最小限のデータしかなく、現場で手作業で印刷および記入されます。この場合、フォーム印刷プログラムとして使用されています。

レポートにはtablix/Matrixコントロールがあり、それらの列のデータが存在するかどうかに関係なく、特定の列数でレポートを作成する必要があります。1つのケース(SSRS)では、合計されるデータフィールドとして使用されているフィールドはありません。

行と列のデータがありますが、必要なのは10列のマトリックス/タブリックスを作成することです。したがって、レコードセットに列を作成するデータのインスタンスが2つしかない場合でも、10列すべてを表示したいのですが、ヘッダーは空白です。

したがって、次のようになります。

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

したがって、1列または10列に相当するデータがある場合でも、実際のヘッダーを含む2列と空白のヘッダーを含む8列を表示したいと思います。

これが私が使用しているSQLです。これは、SSRS2005のマトリックスの基礎です。従業員IDと名前は行です。JobAccount_Tracking_IDは列です。レコードには、1〜10個のtracking_idsを含めることができます。

実際に追跡IDの数に関係なく、合計10個の追跡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の組合は偽のTrakeingIDを使用します。この場合、zzz01からzzz10は、ソートの最後に表示されるようにします。TrackingIDが整数の場合は、9999990〜9999999を使用します。
  2. Row_Number()などのランク付け関数を使用して行をuserIDで分割し、TrackingIDで並べ替えることにより、行をランク付けする外部クエリで全体を囲みます。zzzまたは999999は、偽物が最後に来ることを保証します。
  3. where句のランキング関数を使用して最初の10を取得するもう1つの外部クエリで全体をもう一度囲みます。これにより、既存のトラッキングIDと最大10までの残りの偽のIDが取得されます。

コードは次のとおりです。

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 に答える