SQL查询左联接-有条件联接的第二个表列

时间:2019-05-17 03:34:52

标签: sql

我有2张桌子

像这样的第一张桌子被称为捐助者

+----------------+------------------------+--------+ | Donor_ID | Address_Validated_Date | Source | +----------------+------------------------+--------+ | Character Data | 01JUN2016 | Web | +----------------+------------------------+--------+

我有第二张桌子有捐款

+---------------+----------------+ | Donation_Date | Donor_ID | +---------------+----------------+ | 01MAY2015 | Character data | +---------------+----------------+

Donation_Date的值可以为0,表示无捐赠,或者多个日期都可以反映捐赠日期,例如

+---------------+----------+ | Donation_Date | Donor_ID | +---------------+----------+ | 01MAY2015 | 1 | | 02MAY2015 | 1 | | 0 | 2 | +---------------+----------+

我需要的是一个表,其中列出了Donor_ID,Address_Validated_Date,带有第一个Donation_Date的源(例如,对于Donor_ID为1的2015年1月1日)或0(如果没有捐赠)。

每个Donor_ID应该出现一次-每个Donor_ID应该有一条记录。复杂的是它应该在最近的两个月内,所以Address_Validated_Date应该从2019年4月1日开始。

然后,我需要创建另一列以显示Donation_Date和Address_Validated_Date之间的天数差异。最终输出应为

+----------+------------------------+--------+---------------+------------+ | Donor_ID | Address_Validated_Date | Source | Donation_Date | Days_After | +----------+------------------------+--------+---------------+------------+

2 个答案:

答案 0 :(得分:0)

SELECT D.Donor_ID
    ,D.Address_Validated_Date
    ,D.Source
    ,CASE 
        WHEN DS.Donation_Date IS NULL
            OR DATE (DS.Donation_Date) = '18000101'
            THEN CONVERT(VARCHAR(100), DS.Donation_Date)
        ELSE 0
        END AS Donation_Date
    ,DS.Days_After
FROM Donors D
LEFT JOIN (
    SELECT Donar_ID
        ,MIN(Donation_Date) AS Donation_Date
    FROM donations
    GROUP BY Donar_ID
    ) DS
    ON D.Donor_ID = DS.Donor_ID
WHERE DATE(D.Address_Validated_Date)>='20190401'

答案 1 :(得分:0)

是的,您可以按照以下方式使用DATEDIFF函数

DATEDIFF(时间间隔,STARTING_DATE,ENDING_DATE)

您的查询将如下

SELECT DM.Donor_ID,DM.Address_Validated_Date,DM.Source,
D.Donation_Date,DATEDIFF(DAY,DM.Address_Validated_Date,D.Donation_Date) asDays_After  
FROM Donor D
LEFT JOIN DonorMaster DM on DM.Donor_ID=D.Donor_ID