0

次のような結果セットを返すテーブル値関数があります

id     condition state     costs
1      yes                 300
2      yes                 1000
3      yes                 120
4      no                  20
5      no                  240

関数自体はこのクエリに基づいています

;with x
as
(
select   c.pat_id
        ,sum(std_cost) as Costs
        from claims as c 
        where c.pat_id in
        (
            select   c.pat_id
                from claims as c
                where c.admission_date between '2007-01-01' and '2007-01-31'
        )
        group by c.pat_id

),y
as
(
    select c.pat_id
        from claims as c
        inner join icd_patient as i
        on i.id=c.id
        inner join tblicd as t
        on t.icd=i.icd
        where t.icd like '707%'
        group by c.pat_id
)               

select   [Condition State]
        ,count(*) as  [Number Patients]
        ,avg(costs) as [Average Healthcare costs]
    from
    (
    select   x.pat_id
            ,case when y.pat_id is null then 'Condition Absent' else 'Condition Present' end as [Condition State]
            ,costs
            from x
            left join y on x.pat_id=y.pat_id
    )r
    group by [Condition State]

もちろん、この行LIKE '707%'は関数内のパラメーターに置き換えられます。tbliICDこの関数の入力パラメーターのソースであるコードのリストを含むというテーブルがあります。テーブル内のすべてのコードに対してこのクエリを実行する方法を知りたいtblicdです。これを行うには、どのような方法を使用できますか? 必要なすべてのコードを含むテーブル値パラメーターを送信し、コードごとに関数を 1 回実行することは可能ですか?

4

1 に答える 1

1

CROSS APPLY を使用します。次のようになります。

SELECT
  t.col, t.code, f.id, f.conditionState, f.costs
FROM yourTable AS t
CROSS APPLY dbo.yourTVF(t.code) AS f;

関数がインライン TVF の場合、これは非常に効率的です。

于 2013-03-28T01:30:33.050 に答える