2

次のようなものを実装するにはどうすればよいですか?

declare @myInt int
set @myInt=(select count(*) from x)
;with x as

(
select row_number() over(partition by c.patientid order by c.admissiondate) as rn
    ,c.patientid,c.admissiondate
    ,max(c.claimsfromdate)  as maxHemiDate
    ,min(c.claimsfromdate) minHemiDate  
    ,(
        select max(c2.claimsfromdate)
            from claims as c2
            where c2.patientid=c.patientid
            group by c2.patientid
     ) as maxClaimsDate

         ,p.drgCode
         ,datediff(dd,min(c.claimsfromdate),max(c.claimsfromdate)) /7 as weeksWithHemi
         from claims as c inner join icdclaims as ci on ci.id=c.id
         inner join tblicd as t on t.icd_id=ci.icd_id
         inner join patient as p on p.patientid=c.patientid
         and p.admissiondate = c.admissiondate
         and p.dischargedate = c.dischargedate
         where t.icdText like '%X%'  and p.statecode='21'
         group by c.patientid, c.admissiondate, p.drgCode
)

select p.patientid, count(*)
    from patient as p
    left join x on x.patientid=p.patientid
    where x.patientid is null
    group by p.patientid

これが実行されたときにスローされるエラーは

無効なオブジェクト名x

変数宣言がCTEの外にあるので、これが起こるだろうと私はちょっと考えました。の括弧内に宣言を移動すると、WITH別のエラーが発生します。

CTE内でこのような変数を割り当てるにはどうすればよいですか?または、CTEからデータを取得する変数をまったく使用できませんか?

4

5 に答える 5

3

@myIntの行数を取得するには、次のようにします。

declare @myInt int
;with x as
(
   __your query__
)
select p.patientid, count(*)
    from patient as p
    left join x on x.patientid=p.patientid
    where x.patientid is null
    group by p.patientid


set @myInt=@@ROWCOUNT 

編集済み(Due Jon Egertonコメント)x行をカウントする必要がある場合は、テンポレイテーブルがその方法です。

declare @myInt int
;with x as
(
   __your query__
)
select * 
into #tmp_x
from x;

set @myInt=(select count(*) from #tmp_x)

select p.patientid, count(*)
    from patient as p
    left join #tmp_x x on x.patientid=p.patientid
    where x.patientid is null
    group by p.patientid

ありがとうジョン・エガートン

于 2012-08-17T13:54:12.253 に答える
3

SQL Server 2005以降を使用している場合は、各行に合計を入力できます。

select t.*, cnt, count(*) over () as NumRows
from (select p.patientid, count(*) as cnt
      from patient as p left join
           x
           on x.patientid=p.patientid
      where x.patientid is null
      group by p.patientid
    ) t

合計を使用してパーセンテージなどを計算する場合は、各行に値を設定すると便利な場合があります。

于 2012-08-17T14:30:38.370 に答える
2

問題はこの行にあります:

set @myInt=(select count(*) from x)

x宣言される前に選択を実行しようとしています!

アップデート

この場合、CTEではなく一時テーブルまたはテーブル変数を使用するのが最適です。例えば:

declare @myInt int

select row_number() over(partition by c.patientid order by c.admissiondate) as rn
    ,c.patientid,c.admissiondate
    ,max(c.claimsfromdate)  as maxHemiDate
    ,min(c.claimsfromdate) minHemiDate  
    ,(
        select max(c2.claimsfromdate)
            from claims as c2
            where c2.patientid=c.patientid
            group by c2.patientid
     ) as maxClaimsDate

         ,p.drgCode
         ,datediff(dd,min(c.claimsfromdate),max(c.claimsfromdate)) /7 as weeksWithHemi
         INTO #XTable
         from claims as c inner join icdclaims as ci on ci.id=c.id
         inner join tblicd as t on t.icd_id=ci.icd_id
         inner join patient as p on p.patientid=c.patientid
         and p.admissiondate = c.admissiondate
         and p.dischargedate = c.dischargedate
         where t.icdText like '%X%'  and p.statecode='21'
         group by c.patientid, c.admissiondate, p.drgCode

set @myInt=(select count(*) from #XTable)

select p.patientid, count(*)
    from patient as p
    left join #XTable x on x.patientid=p.patientid
    where x.patientid is null
    group by p.patientid

これは手っ取り早い方法ですが、スクリプトの早い段階でテーブルを宣言することもできます。

于 2012-08-17T13:51:47.757 に答える
2

CTE2つの異なるステートメントに単一を使用することはできません-それらは範囲外になります。

したがって、変数の必要性を取り除く必要があるか、テーブル変数を宣言して、それを何度でも選択し続けることができます。

テーブルvarは次のように宣言できます。

declare @x table (rowno int, patientid varchar...

次に、現在CTEにある選択を使用してそれを埋めることができます。

于 2012-08-17T13:53:59.993 に答える
0

CTEは複数形の場合があります。述べた問題を解決することはできませんが、複雑なCTEをいくつかのステップに分割し、それぞれが以前の定義に基づいて構築する方が明確な場合がよくあります。この例では、再帰CTEと、最初のCTEに基づいて統計を計算する2番目のCTEがあります。ファイナルSELECTは結果を組み合わせたものです。

with CTE
  as (
    select 1 as Number
    union all
    select Number + 1
      from CTE
      where Number < 10
    ),
  Summary
  as (
    select Count( 42 ) as HowMany, Min( Number ) as Least, Max( Number ) as Most
      from CTE
    )
  select *
    from CTE cross join
      Summary
于 2012-08-17T15:17:22.933 に答える