需要条件分支的帮助。必须做一个报告来获取会员数据和地址是其中一个领域。如果地址属于某种类型,则逻辑会有所不同,因此在进行连接时会遇到问题,并在CASE2行时选择它。
如果地址类型既不是医院也不是设施,则加入很简单。如果确实是医院或设施类型,则必须返回NON医院和设施类型的最新活动地址。
Addresses Table
ADDRESS_ID, PERSON_ID, ADDRESS_LINE1, ADDRESS_LINE2
Person Table
PERSON_ID, FIRSTNAME, LASTNAME
select distinct
P.FirstName, P.LastName, PH.HomePhone1,
A.Address_Line1 --check below for my pseudo code
from Person as P
join Phones as PH
on P.Person_ID = PH.Person_ID
join Addresses as A
on P.Person_ID = A.Person_ID
and
(
(A.Preferred = 'Y' and A.Type not in ('Hospital','Facility')) --CASE1
or (A.Preferred = 'Y' and A.Type in ('Hospital','Facility')) -- CASE2
)
CASE2中的A.Address_Line1需要来自
之类的东西Select TOP 1 ADDRESS_ID from Addresses where PERSON_ID = P.PERSON_ID and A.TYPE not in ('Facility','Hospital') and A.Preferred = 'Y'
不确定如何直接回复ADyson,所以在这里添加。 我错过了如何获取CASE2的AddressLine1的概念,我发布的代码是我到目前为止所拥有的。除了使用CTE和游标之外,我没有看到这样做的简单方法。不是远景的sql大师。
CASE1和CASE2正是我对解决方案的期望,所以它很可能不符合我的要求,但它就是我的全部。
我需要知道如何在SQL中实现这个概念以正确填充A.AddressLine1。
var addressLine1 = string.empty;
if(address.Preferred = true && address.Type not in ('Hospital','Facility'))
addressLine1 = address.addressLine1;
if(address.Preferred = true and address.Type in ('Hospital','Facility'))
addressLine1 = select top 1 addressLine1 from Addresses where address.Preferred = 'Y' and address.Type not in ('Hospital','Facility')
上面的伪代码必须以某种方式与顶级SQL语句和连接一起使用。只需要一个指向如何在SQL中完成它的正确方法的指针。
如果您需要更多详细信息,请与我们联系,谢谢。
答案 0 :(得分:0)
这将为每个人返回一个非医院/设施地址。如果有首选非医院/设施地址,则会先返回该地址,否则会根据added_date desc
返回最近添加的地址。
select
P.FirstName
, P.LastName
, PH.HomePhone1
, x.Address_Line1
--, x.Type
--, x.Preferred
from Person as P
join Phones as PH
on P.Person_ID = PH.Person_ID
outer apply (
select top 1 a.Address_Line1
--, a.Type
--, a.Preferred
from Addresses as A
where P.Person_ID = A.Person_ID
and A.[Type] not in ('Hospital','Facility')
order by
case when A.Preferred = 'Y' then 0 else 1 end asc
, A.added_date desc
) as x