1

選択したパラメーターに基づいてレコードを選択するためにCTEを使用するSSRSレポート用のTSQLスクリプトを作成しようとしています。これを行うための最も効率的な方法を、すべてTSQLまたはSSRS、あるいはその両方で探しています。NULL(すべての値)または1つの特定の値に設定できる4つのパラメーターがあります。次に、私のCTEには、次の行があります。

    ROW_NUMBER() over(partition by G.[program_providing_service],G.people_id
    order by G.[actual_date] desc) as rowID

上記のCTEは、ProgramがNULLで、PeopleがNULLでない場合に使用されます。私の4つのパラメータは次のとおりです。

プログラム、施設、スタッフ、そして人々。

したがって、値がNULLの場合にのみ値を分割したいと思います。現在、パラメータ値に応じて1つのCTEでこれを実装しています。たとえば、Peopleを除くすべてのパラメータにNULLを選択した場合、このCTEは次のようになります。

    ROW_NUMBER() over(partition by G.people_id
    order by G.[actual_date] desc) as rowID

または、5つのパラメーターすべてがnullの場合:

    ROW_NUMBER() over(partition by G.[program_providing_service], G.[site_providing_service], G.staff_id, G.people_id
    order by G.[actual_date] desc) as rowID

4つのパラメーターのいずれにもNULLを選択しない場合は、actual_dateの降順で上位1レコードが必要なため、フィールドでパーティション化する必要はありません。これは私のCTEがどのように見えるかです:

;with cte as
(
Select    distinct
    G.[actual_date],
    G.[site_providing_service],
    p.[program_name],
    G.[staff_id],
    G.program_providing_service,
    ROW_NUMBER() over(partition by G.[program_providing_service],G.people_id
    order by G.[actual_date] desc) as rowID

From 
event_log_rv G With (NoLock)

WHERE 
...
AND (@ClientID Is Null OR [people_id]=@ClientID)
AND (@StaffID Is Null OR [staff_id] = @StaffID)
AND (@FacilityID Is Null OR [site_providing_service] = @FacilityID)
AND (@ProgramID Is Null OR [program_providing_service] = @ProgramID)
and (@SupervisorID is NULL OR staff_id in (select staff_id from #supervisors))
)
SELECT 
    [actual_date],
    [site_providing_service],
    [program_name],
    [staff_id],
    program_providing_service,
    people_id,
    rowID

FROM cte WHERE rowid = 1
ORDER BY [Client_FullName]

ここで、ROW_NUMBER行は、選択したパラメーターによって異なります。現在、このTSQLスクリプトには次のような5つのIFステートメントがあります。

IF @ProgramID IS NOT NULL AND @ClientID IS NULL
BEGIN
...
END

with one CTE in each of these IF statements:

IF @FacilityID IS NOT NULL AND @ClientID IS NULL
BEGIN
...

END

IF @ProgramID IS NOT NULL AND @ClientID IS NULL
BEGIN
...
END

IF @StaffID IS NOT NULL AND @ClientID IS NULL
BEGIN
...

END

IF @ClientID IS NOT NULL
BEGIN
...
END

NULLを選択するか特定の値を選択するかにかかわらず、可能なすべてのオプションをコーディングするにはどうすればよいですか?

4

1 に答える 1

2

OMG....あなたが何をしたいのかを理解しようとするのに長い時間がかかりました。あなたの説明にはいくつかの矛盾があります。お願いはあなたの説明を修正します。あなたが言ったように、あなたはそれらがNULLであるときだけ値を分割したいです。次に、人を除くすべてのパラメーターにNULLを選択すると、人にパーティションを作成すると言いました。

「null」または「notnull」でパーティションを作成する方法に関係なく、多くの[if ... else]を追加する代わりに、動的SQLを構築してこれを実現できます。

次のコードは疑似であり、テストされていません。ヒントを教えてください。次のコードには1つの仮定があります。これは、パラメーターがパーティションの順序で優先されることです。たとえば、Programがnull(またはnull)でない場合、Programは最初の場所にあります。

    declare @sql varchar(max)
    set @sql = '
    ;with cte as
    (
    Select    distinct
        G.[actual_date],
        G.[site_providing_service],
        p.[program_name],
        G.[staff_id],
        G.program_providing_service,
        ROW_NUMBER() over(partition by
    '
    if(@progarm is null)
       set @sql = @sql + 'G.[program_providing_service],'
    if(@facility is null) 
       set @sql = @sql + 'G.[site_providing_service],'
    if(@staff is null )
       set @sql = @sql + 'G.staff_id,'
    if(@people is null)
       set @sql = @sql + 'G.people_id'
    set @sql = @sql + '
        order by G.[actual_date] desc) as rowID
    From 
    event_log_rv G With (NoLock)
    WHERE 
    ...
    AND (@ClientID Is Null OR [people_id]=@ClientID)
    AND (@StaffID Is Null OR [staff_id] = @StaffID)
    AND (@FacilityID Is Null OR [site_providing_service] = @FacilityID)
    AND (@ProgramID Is Null OR [program_providing_service] = @ProgramID)
    and (@SupervisorID is NULL OR staff_id in (select staff_id from #supervisors))
    )
    SELECT 
        [actual_date],
        [site_providing_service],
        [program_name],
        [staff_id],
        program_providing_service,
        people_id,
        rowID
    FROM cte WHERE rowid = 1
    ORDER BY [Client_FullName]
    '
    exec(@sql)

于 2013-03-15T05:51:42.297 に答える