我的主要问题是由splash58精心解答here但是我遇到了代码的问题,我认为还有另外一个问题(也就是说:解决方案已经产生了更多问题的怪物!)。
我有一个数据样本,从2014年7月1日到2014年12月31日。这是我最初的SQL查询:
SELECT
ADV.AcctNum
,ADV.Name
,ADV.HomePhoneNum
,ADV.ReasonForVisit
,ADV.ServiceDateTime
,ADI.ErDx
,PRV.PCP
,ADI.ErDispoID
,ADI.ErDispoName
,ADI.Dx
FROM Visits ADV
JOIN Discharge ADI ON (ADI.VisitID = ADV.VisitID AND
ADI.SourceID = ADV.SourceID )
JOIN Providers PRV ON (PRV.VisitID = ADV.VisitID AND
PRV.SourceID = PRV.SourceID )
WHERE ADV.ServiceDateTime BETWEEN '2014-07-01' AND '2014-12-31' AND
ADI.ErDispoName IS NOT NULL AND
( UPPER(ADV.ReasonForVisit) LIKE UPPER('%FLU%') OR
UPPER(ADV.ReasonForVisit) LIKE UPPER('%COLD%') OR
UPPER(ADI.ErDiagnosis) LIKE UPPER('%FLU%') OR
UPPER(ADI.ErDiagnosis) LIKE UPPER('%COLD%') OR
UPPER(ADI.Diagnosis) LIKE UPPER('%FLU%') OR
UPPER(ADI.Diagnosis) LIKE UPPER('%COLD%')) AND
ADV.FacilityID = '.' AND
ADV.Name LIKE '%SMITH%'
ORDER BY ADV.ServiceDateTime
这就是回归:
AccountNum Name HomePhoneNum ReasonForVisit ServiceDateTime ErDx PCP ErDispoID ErDispoName Dx
1 SMITH,JOHN 999-999-9999 FLU 8/12/2014 FLU FORZ AMA *AGAINST MEDICAL ADVICE (07) NULL
2 SMITH,JOHN 999-999-9999 Cold 8/23/2014 UPPER REPIRATORY INFECTION FORZ H *HOME (01) NULL
3 SMITH,JOHN 999-999-9999 COUGH 8/24/2014 FLU FORZ H *HOME (01) NULL
4 SMITH,JOHN 999-999-9999 COUGH 10/29/2014 PNEMONIA FORZ MSHH *ADMIT TO HH (09) Flu
5 SMITH,JOHN 999-999-9999 COUGH 11/5/2014 FLU FORZ H *HOME (01) NULL
6 SMITH,JOHN 999-999-9999 FLU 11/7/2014 FLU FORZ H *HOME (01) NULL
7 SMITH,JOHN 999-999-9999 Flu 11/8/2014 FLU FORZ H *HOME (01) NULL
8 SMITH,JOHN 999-999-9999 FLU 12/13/2014 FLU FORZ H *HOME (01) NULL
注意ServiceDateTime字段。所以现在,我减少了代码(丢失了连接),以便我可以尝试使用其他问题的代码。见下文......
SELECT DISTINCT
t1.AcctNum
,t1.UnitNum
,t1.Name
,t1.HomePhoneNum
,t1.ReasonForVisit
,t1.ServiceDateTime
FROM Visits t1
Inner Join Visits t2 ON (t1.UnitNumber = t2.UnitNumber AND
t1.AccountNum != t2.AccountNum AND
t1.ServiceDateTime > t2.ServiceDateTime AND
DATEDIFF(day, t1.ServiceDateTime, t2.ServiceDateTime) < 30)
WHERE t1.ServiceDateTime BETWEEN '2014-08-01' AND '2014-12-31' AND
( UPPER(t1.ReasonForVisit) LIKE UPPER('%COLD%') OR
UPPER(t1.ReasonForVisit) LIKE UPPER('%FLU%') OR
UPPER(t1.ReasonForVisit) LIKE UPPER('%COUGH%')) AND
t1.FacilityID = '.' AND
t1.Name LIKE '%SMITH%'
当我想到这有效时,我感到非常兴奋,但不幸的是,有一个小缺陷。结果如下......
AccountNum UnitNum Name HomePhoneNum ReasonForVisit ServiceDateTime
1 1234 SMITH,JOHN 999-999-9999 FLU 8/12/2014
3 1234 SMITH,JOHN 999-999-9999 COUGH 8/24/2014
5 1234 SMITH,JOHN 999-999-9999 COUGH 11/5/2014
6 1234 SMITH,JOHN 999-999-9999 FLU 11/7/2014
7 1234 SMITH,JOHN 999-999-9999 Flu 11/8/2014
我期待收回AccountNum“3,5,6和7”但不是数字1.为什么它返回账户1?此帐户在30天内没有访问过,因此应从此列表中删除。另外,如上所述,在这个新的查询中,由于我对SQL的了解有限,我不得不从原始查询中省略其他连接。这些是获取我需要的所有信息所必需的。
所以我需要知道为什么这个查询返回AccountNum“1”,(当我将日期范围更改为08/12/14之后它工作得很好),然后我需要帮助我的代码才能使用这个新查询包括第一个查询中的所有数据。
感谢您的帮助,如果需要澄清,请告诉我,我知道这是一个复杂的问题!
更新
请注意:我运行了以下查询,以便根据评论中的人的要求获取此人的“全部”访问次数。我甚至将查询从“2014-06-01”运行到“2014-12-31”以确定。
SELECT
AcctNum
,Name
,LocationID
,ServiceDateTime
,ReasonForVisit
FROM Visits
WHERE ServiceDateTime BETWEEN '2014-06-01' AND '2014-12-31' AND
UnitNum = '1234'
ORDER BY ServiceDateTime
2014-08-12之前没有任何访问,并且在该日期之后从我的其他查询中过滤掉的所有其他访问显然没有影响。见下文:
AccountNum Name ServiceDateTime
1 SMITH,JOHN 2014-08-12
2 SMITH,JOHN 2014-08-23
3 SMITH,JOHN 2014-08-24
100 SMITH,JOHN 2014-08-26
99 SMITH,JOHN 2014-09-03
98 SMITH,JOHN 2014-09-04
97 SMITH,JOHN 2014-09-12
96 SMITH,JOHN 2014-10-13
95 SMITH,JOHN 2014-10-21
94 SMITH,JOHN 2014-10-24
4 SMITH,JOHN 2014-10-29
5 SMITH,JOHN 2014-11-05
6 SMITH,JOHN 2014-11-07
7 SMITH,JOHN 2014-11-08
8 SMITH,JOHN 2014-12-13
所有90以上的帐户都显示 在日期范围内(但不是在2014-08-12之前)进行了其他访问,并且查询已正确筛选出来。
答案 0 :(得分:4)
我相信DATEDIFF
函数中参数的排序是倒退的,尽管仍然无法解释该行返回的原因。正如@Zach Ford所说,在不知道实际数据的情况下(与其他一些查询的结果相反),很难说。我的猜测是,UnitNumber的行有不流感,咳嗽等,所以他们不会在原始查询中返回,但它们仍然存在于表格中仍会被INNER JOIN
抓住。如果您要将这些条目排除在加入之外,那么您还需要将该条件添加到JOIN
的{{1}}条款中。