我已经搜索过,但似乎无法将其准确地发送到我需要的地方。这与Microsoft SQL Server有关。
我希望加入两个表,但只在第一个表中的日期之后的第一个日期从第二个表中提取数据。请参阅下面的代码。
我有一张表格,显示发送给客户的电子邮件,如下所示:
SELECT
e.Name
,se.SubscriberID
,se.SendID
,c1.Id
,ds.Service_Num
,sub.EmailAddress
,se.EventDate as 'SentDate'
into #temp_billing_emails
FROM
bi_views.dbo.sfdcMC_SentEvent se
left join bi_views.dbo.sfdcmc_job j on j.jobid=se.sendid
left join bi_views.dbo.sfdcMC_Email e on e.id=j.emailid
left join bi_views.dbo.sfdcMC_Subscriber sub on sub.id=se.SubscriberID
left join sfdcprod.dbo.contact c1 on sub.subscriberkey=c1.id
left join bi_views.dbo.DIM_SERVICE_RF ds on c1.id=ds.ContractSignerContactID_bk
WHERE
e.name like '%Past Due%'
从那里,我想知道电子邮件接收者在收到的电子邮件之后花了多少天进行首次付款。我已经得到了这个:
SELECT
e.*
,z.zuora__createddate__c
,z.zuora__status__c
,z.zuora__amount__c
,datediff(dd,e.sentdate,z.Zuora__CreatedDate__c) DaysToPay
FROM
#temp_billing_emails e
left join sfdcprod.dbo.Service__C sc on e.Service_Num = right(sc.name,len(sc.name)-2)
left join sfdcprod.dbo.[zuora__customeraccount__c] a on sc.billing_account__c=a.id
left join sfdcprod.dbo.[zuora__payment__c] z on a.id=z.zuora__billingaccount__c
WHERE
datediff(dd,e.sentdate,z.Zuora__CreatedDate__c)>=0
and z.zuora__status__c not like 'Error'
这可以让我收到客户收到电子邮件后所支付的所有款项。我需要的只是他们的第一笔付款金额以及电子邮件之后的日期。
我尝试了这样的MIN()函数:
SELECT TOP 100
e.EmailAddress
,e.SentDate
,e.Service_Num
,z.zuora__createddate__c
,z.zuora__status__c
,z.zuora__amount__c
,datediff(dd,e.sentdate,min(z.Zuora__CreatedDate__c)) DaysToPay
FROM
#temp_billing_emails e
left join sfdcprod.dbo.Service__C sc on e.Service_Num = right(sc.name,len(sc.name)-2)
left join sfdcprod.dbo.[zuora__customeraccount__c] a on sc.billing_account__c=a.id
left join sfdcprod.dbo.[zuora__payment__c] z on a.id=z.zuora__billingaccount__c
WHERE
datediff(dd,e.sentdate,z.Zuora__CreatedDate__c)>=0
and z.zuora__status__c not like 'Error'
GROUP BY
e.EmailAddress
,e.SentDate
,e.Service_Num
,z.zuora__createddate__c
,z.zuora__status__c
,z.zuora__amount__c
任何帮助都会非常感激。
答案 0 :(得分:1)
outer apply()
是解决此类问题的好方法。
select
e.Name
, se.SubscriberID
, se.SendID
, c1.Id
, ds.Service_Num
, sub.EmailAddress
, se.EventDate as 'SentDate'
, x.zuora__createddate__c
, x.zuora__status__c
, x.zuora__amount__c
, DaysToPay = datediff(day,se.EventDate,x.Zuora__CreatedDate__c)
from bi_views.dbo.sfdcMC_SentEvent se
inner join bi_views.dbo.sfdcmc_job j on j.jobid=se.sendid
inner join bi_views.dbo.sfdcMC_Email e on e.id=j.emailid and e.name like '%Past Due%'
left join bi_views.dbo.sfdcMC_Subscriber sub on sub.id=se.SubscriberID
left join sfdcprod.dbo.contact c1 on sub.subscriberkey=c1.id
left join bi_views.dbo.DIM_SERVICE_RF ds on c1.id=ds.ContractSignerContactID_bk
outer apply (
select top 1
z.zuora__createddate__c
, z.zuora__status__c
, z.zuora__amount__c
from sfdcprod.dbo.Service__C sc
inner join sfdcprod.dbo.[zuora__customeraccount__c] a
on sc.billing_account__c=a.id
and ds.Service_Num = right(sc.name,len(sc.name)-2)
inner join sfdcprod.dbo.[zuora__payment__c] z
on a.id=z.zuora__billingaccount__c
and z.zuora__status__c not like 'Error'
and z.Zuora__CreatedDate__c >= se.EventDate
order by z.Zuora__CreatedDate__c asc
) as x
我认为这是没有临时表的情况:
jQuery