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

如果您使用的是 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 回答
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 

已编辑(由于 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 回答
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

您不能将单个CTE语句用于两个不同的语句 - 它们超出了范围。

因此,要么您需要删除对变量的需求,要么您可以只声明一个表变量,然后根据需要继续选择该变量。

您可以按如下方式声明表 var:

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

然后,您可以使用您当前在 CTE 中获得的选择来填充它。

于 2012-08-17T13:53:59.993 回答
0

CTE 可以是复数。它不能解决您所说的问题,但是将复杂的 CTE 分解为几个步骤通常更清楚,每个步骤都基于先前的定义。在此示例中,有一个递归 CTE 和第二个 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 回答