2016-04-14 97 views
1

我有一个查询正在跟踪“患者日”或进入和离开当天的患者(csn_id)。这发生在以下两种方式之一MS-SQL中的列无效错误

  1. 承认并与1
  2. 自动当天排出的与事件类型的事件类型放电6

一切都看起来很不错,直到我说我集团By语句。我已阅读收到相同的“消息8120”的其他问题的帖子,但我不知道我是如何解决这个问题,并开放给任何/所有的建议。

SELECT 
'1,*'+char(13)+char(10) 
+'80,1006057'+char(13)+char(10) 
+'100,10'+char(13)+char(10) 
+'2405,'+cast(count(distinct adt.PAT_ENC_CSN_ID) as varchar(18))+char(13)+char(10) --Census events --as varchar(10) 
+'2420,'+format(adt.EFFECTIVE_TIME,'M/d/yyyy') --as efftime 
FROM CLARITY_ADT adt 
inner join PAT_ENC_HSP hsp on adt.PAT_ENC_CSN_ID=hsp.PAT_ENC_CSN_ID 
WHERE adt.EVENT_SUBTYPE_C <>2 AND --no canelled events 
     datediff(day,adt.EFFECTIVE_TIME,cast(CURRENT_TIMESTAMP as date)) between 1 and 7 AND 

    ((adt.EVENT_TYPE_C ='6' AND 
    adt.DEPARTMENT_ID in ('101000020', '101000021', '101000013', '101000014', '101000002', 
         '101000018', '101000003', '101000114', '101000005', '101000017', 
         '101000006', '101000118', '101000007', '101000016', '101000004', 
         '101000009', '101000010', '101000011', '101000022', '101000023', 
         '101000012')) OR 
    (cast(hsp.HOSP_ADMSN_TIME as date) = cast(hsp.HOSP_DISCH_TIME as date) AND 
    adt.EVENT_TYPE_C ='1' AND 
    adt.DEPARTMENT_ID in ('101000020', '101000021', '101000013', '101000014', '101000002', 
         '101000018', '101000003', '101000114', '101000005', '101000017', 
         '101000006', '101000118', '101000007', '101000016', '101000004', 
         '101000009', '101000010', '101000011', '101000022', '101000023', 
         '101000012'))) 

group by cast(adt.EFFECTIVE_TIME as date) 
order by cast(adt.EFFECTIVE_TIME as date) 
+0

什么类型EFFECTIVE_TIME专栏? – Simon

回答

0

当你做一个group by,你被允许在查询结果的唯一事情就是要么组本身,还是喜欢maxsum聚合。

您正在按cast(adt.EFFECTIVE_TIME as date)进行分组,但您的查询包含format(adt.EFFECTIVE_TIME,'M/d/yyyy') - 虽然这些在逻辑上可能相同,但它们并不相同,因此SQL Server会告诉您它不好。

你可以把format(adt.EFFECTIVE_TIME,'M/d/yyyy')group by,或者什么可能会更好,将是把日期到查询,然后换行与外部查询格式化你的结果:

select 
    '1,*'+char(13)+char(10) 
    +'80,1006057'+char(13)+char(10) 
    +'100,10'+char(13)+char(10) 
    +'2405,'+cast(num_records as varchar(18))+char(13)+char(10) --Census events --as varchar(10) 
    +'2420,'+format(the_date,'M/d/yyyy') --as efftime 
from 
(
    select 
     cast(adt.EFFECTIVE_TIME as date) [the_date] 
     ,count(distinct adt.PAT_ENC_CSN_ID) [num_records] 
    FROM CLARITY_ADT adt 
    WHERE ... /* where and join clauses */ 
    group by cast(adt.EFFECTIVE_TIME as date) 
) x 
order by x.the_date; 
+0

伟大的解释 - 格式做了诡计乔 - 谢谢! 我同意你的外部查询,但我对这些并不很了解,并没有很多经验。这似乎工作,所以我正在运行它。再次感谢! –