我相信我在最后一次加入时犯了一个菜鸟错误,但我看不出它是什么。代码工作,直到我需要添加DONCOMMS表中记录的最后一个条目。 (此表包含每个捐赠者的所有通信)现在我从第一个表中为每个条目获得3个重复行。
原始报告向我展示了DON0010的所有捐助者承诺,并分别将AREA和DON0001表中的区域描述和捐赠者联系起来。我现在想要在DONCOM10中找到每个承诺中的DONCOMMS中发现的最新信息。
select
pl.[PLEDGE_NO]
,d1.[DONOR_NO]
,rtrim(pl.DONOR) DONOR
,d1.[CONTACT_NAME]
,d1.[AREA1]
,a1.[DESCRIPTION]
,pl.[AMOUNT]
,pl.[AMOUNT_RECVD]
,pl.[TYPE]
,ISNULL(t2.[COMM_TYPE],'') AS COMM_TYPE
,ISNULL(t2.[REFERENCE],'') AS REFERENCE
,ISNULL(t2.[DETAIL],'') AS DETAIL
,replace(isnull(convert(varchar, t2.[DATE], 103),''),'01/01/1753','') COMMS_DATE
,ISNULL(t2.[CONTACT],'') AS CONTACT
from don0010 pl
left join DON0001 d1 on pl.[DONOR] = d1.[DONOR]
left join AREA1 a1 on d1.[AREA1] = a1.[AREA]
**left join (Select * from doncomms dc where dc.DATE = (SELECT MAX(DATE) FROM doncomms WHERE DONOR_NO = dc.DONOR_NO) and ENTITY = 'C') t2
on t2.[DONOR_NO] = d1.[DONOR_NO]**
答案 0 :(得分:0)
select
pl.[PLEDGE_NO]
,d1.[DONOR_NO]
,rtrim(pl.DONOR) DONOR
,d1.[CONTACT_NAME]
,d1.[AREA1]
,a1.[DESCRIPTION]
,pl.[AMOUNT]
,pl.[AMOUNT_RECVD]
,pl.[TYPE]
,ISNULL(t2.[COMM_TYPE],'') AS COMM_TYPE
,ISNULL(t2.[REFERENCE],'') AS REFERENCE
,ISNULL(t2.[DETAIL],'') AS DETAIL
,replace(isnull(convert(varchar, t2.[DATE], 103),''),'01/01/1753','') COMMS_DATE
,ISNULL(t2.[CONTACT],'') AS CONTACT
from don0010 pl
left join DON0001 d1 on pl.[DONOR] = d1.[DONOR]
left join AREA1 a1 on d1.[AREA1] = a1.[AREA]
outer apply
(
select top 1 with ties dc.*
from doncomms dc
where dc.DONOR_NO = d1.DONOR_NO and dc.ENTITY = 'C'
order by dc.DATE desc
) t2
答案 1 :(得分:0)
问题通常在于您有多行DONOR_NO
单独尝试此查询,以查明同一Select DONOR_NO, count(*)
from doncomms dc
where dc.DATE = (SELECT MAX(DATE)
FROM doncomms
WHERE DONOR_NO = dc.DONOR_NO)
and ENTITY = 'C'
GROUP BY DONOR_NO
是否出现过多次
CTE
如果您使用ROW_NUMBER()
syntaxis和WITH cte as (
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY DONOR_NO ORDER BY DATE DESC) as rn
FROM doncomms
WHERE ENTITY = 'C'
) T
WHERE T.rn = 1
)
select *
from don0010 pl
left join DON0001 d1 on pl.[DONOR] = d1.[DONOR]
left join AREA1 a1 on d1.[AREA1] = a1.[AREA]
left join cte as t2
on t2.[DONOR_NO] = d1.[DONOR_NO]
{{1}}
答案 2 :(得分:0)
谢谢Juan,我只需要添加字段名称作为视图运行。
WITH cte as (
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY DONOR_NO ORDER BY DATE DESC) as rn
FROM doncomms
WHERE ENTITY = 'C'
) T
WHERE T.rn = 1
)
select pl.[PLEDGE_NO]
,d1.[DONOR_NO]
,rtrim(pl.DONOR) DONOR
,d1.[CONTACT_NAME]
,d1.[AREA1]
,a1.[DESCRIPTION]
,pl.[AMOUNT]
,pl.[AMOUNT_RECVD]
,pl.[TYPE]
,pl.[SOURCE]
,d1.[POST_CODE] as DONOR_POSTCODE
,replace(isnull(convert(varchar, pl.PLEDGE_DATE, 103),''),'01/01/1753','') PLEDGE_DATE
,replace(isnull(convert(varchar, pl.[EVENT_DATE], 103),''),'01/01/1753','') EVENT_DATE
,rtrim(pl.DESCRIPTION1) DESCRIPTION1
,rtrim(pl.DESCRIPTION2) DESCRIPTION2
,pl.[COMPLETE]
,pl.[APPLICATION]
,rtrim(pl.COMMENT1) COMMENT1
,rtrim(pl.COMMENT2) COMMENT2
,pl.[MEMO]
,ISNULL(t2.[ENTERED_BY] , '') AS ENTERED_BY
,ISNULL(t2.[COMM_TYPE],'') AS COMM_TYPE
,ISNULL(t2.[REFERENCE],'') AS REFERENCE
,ISNULL(t2.[DETAIL],'') AS DETAIL
,replace(isnull(convert(varchar, t2.[DATE], 103),''),'01/01/1753','') COMMS_DATE
,ISNULL(t2.[CONTACT],'') AS CONTACT
from don0010 pl
left join DON0001 d1 on pl.[DONOR] = d1.[DONOR]
left join AREA1 a1 on d1.[AREA1] = a1.[AREA]
left join cte as t2
on t2.[DONOR_NO] = d1.[DONOR_NO]