Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何选择在过去一年中未作出贡献的捐助者(SQL)_Sql_Ms Access - Fatal编程技术网

如何选择在过去一年中未作出贡献的捐助者(SQL)

如何选择在过去一年中未作出贡献的捐助者(SQL),sql,ms-access,Sql,Ms Access,我有一个简单的数据库,可以记录对慈善组织的捐款 为了这个问题的目的,我只需要提到所涉及的两个表格:捐款和捐助者 捐助者: 捐款: 该数据库中的许多赞助者不止一次作出贡献;主要是每月一次。然而,我想指出的是,在过去的一年中没有做出贡献的捐助者 我该怎么做呢 我尝试过各种内部连接的方法,但都偏离了正轨。使用左连接 SELECT b.* FROM Benefactors b INNER JOIN Contributions c ON b.id = c.BenefactorID WHERE c.Cont

我有一个简单的数据库,可以记录对慈善组织的捐款

为了这个问题的目的,我只需要提到所涉及的两个表格:捐款和捐助者

捐助者:

捐款:

该数据库中的许多赞助者不止一次作出贡献;主要是每月一次。然而,我想指出的是,在过去的一年中没有做出贡献的捐助者

我该怎么做呢

我尝试过各种内部连接的方法,但都偏离了正轨。

使用左连接

SELECT b.*
FROM Benefactors b
INNER JOIN Contributions c ON b.id = c.BenefactorID
WHERE c.ContributionDate < DATEADD(year,-1,GETDATE())
获取过去一年未捐款的捐助者名单

SELECT A.* FROM Benefactors AS B 
LEFT JOIN Contributions AS C 
ON B.ID  = C.BenefactorID  AND C.BenefactorID IS NULL 
WHERE C.ContributionDate < DATEADD(year,-1,GETDATE())
试试这个

   select * from Benefactors b where b.ID not in  (select BenefactorID  from Contributions where  datepart(yy,ContributionDate)=datepart(yy,getdate())-1 )


当您想选择上一年未做出任何贡献的赞助人名单时,如果当前年份=2014,那么上一年=2013,请尝试以下代码:

SELECT * FROM Benefactors 
WHERE ID NOT IN
 (SELECT BenefactorID FROM Contributions 
 WHERE DATEPART(yyyy, ContributionDate)  >
       DATEPART(yyyy, DATEADD(year,-2,GETDATE()))
 AND DATEPART(yyyy, ContributionDate) < DATEPART(yyyy, GETDATE())

由于Access不支持负集运算符,因此在这种情况下可能会有点混乱。我认为这样的查询可以满足您的需要:

SELECT v.ID, v.[Benefactor Name], v.MaxContributionDate
FROM (
    SELECT b.ID, b.[Benefactor Name], mx.MaxContributionDate
    FROM benefactors b
    INNER JOIN (
        SELECT MAX([Contribution Date]) AS MaxContributionDate, [Benefactor ID]
        FROM contributions
        GROUP BY [Benefactor ID]
    ) mx ON (mx.[Benefactor ID] = b.ID)
) v
LEFT JOIN (
    SELECT DISTINCT [Benefactor ID]
    FROM contributions
    WHERE Year([Contribution Date]) = 2014
) t ON (t.[Benefactor ID] = v.ID) 
WHERE t.[Benefactor ID] IS NULL;
行内查询将查找今年已捐款的捐助者的不同列表,键为NULL的左连接确保我们只返回不在此集中的捐助者


编辑:添加了一个额外的连接,以获取每个赞助人的最近供款日期。

在数据量大的数据库中,我认为此查询效率低下-Access将为每个赞助人执行内部查询,这可能会很昂贵Access中不提供日期。如果我将其更改为“现在”,则它会询问我年份的值,然后说表达式键入错误,或者处理起来太复杂。在数据量大的数据库中,我认为此查询效率低下-Access将为每个赞助者执行内部查询,这可能是昂贵的数据量很大的数据库我认为这个查询效率很低-Access会为每个赞助人执行内部查询,这可能是昂贵的这是我尝试过的第一个查询-似乎工作得很好但是,为了再次检查,我如何添加一列,其中包含他们最后一次提交的日期?谢谢-我将很快尝试:这里有点不对劲-它说t.benefactor d=b.ID内部连接SELECT MAXc2.ContributionDate AS ContributionDate附近缺少运算符,c2.benefactured由c2.benefactured mx上的c2.benefactured mx从贡献c2组中受益。benefactured=b.ID,其中t.benefactured为NULL@MikeAnthony-恐怕我看不到任何明显的错误,而且我没有安装Access,因此我自己也无法轻松检查:以下查询基本上删除了左连接吗?:选择b.ID,b.BenefactorName,mx.ContributionDate FROM benefactors b internal JOIN选择MAXc2.ContributionDate作为ContributionDate,c2.benefactor由贡献c2组由c2.benefactor mx在mx.BenefactorID=b.IDIt要求我在运行查询时为mx.ContributionDate输入一个值,当我这样做时,它将返回在该日期做出贡献的所有赞助人。可以肯定,这并不完全正确-它看起来将返回今年之前做出贡献的赞助人,无论他们今年是否做出贡献。如果同一个捐赠者做出了不止一次的贡献,它也会多次返回给同一个捐赠者。他只想看到今年之前已经做出贡献的捐赠者,如何选择去年没有做出贡献的捐赠者,并且它有贡献日期,这样就不会出现混乱。我还假设他希望看到所有供款,因为标题中的供款是复数形式。如果我作为赞助人在2013/01/01和2014/06/04供款,那么您的查询当前将返回2013供款的一行。我所做的只是告诉你今年没有做出哪些贡献,它不会告诉你今年我是否做出了任何其他贡献。
   select * from Benefactors b where b.ID not in  (select BenefactorID  from Contributions where  datepart(yy,ContributionDate)=datepart(yy,getdate())-1 )
 select * from Benefactors b inner join  (select * from Contributions where  datepart(yy,ContributionDate)=datepart(yy,getdate())-1 ) a on b.ID<>a.BenefactorID  
SELECT * FROM Benefactors 
WHERE ID NOT IN
 (SELECT BenefactorID FROM Contributions 
 WHERE DATEPART(yyyy, ContributionDate)  >
       DATEPART(yyyy, DATEADD(year,-2,GETDATE()))
 AND DATEPART(yyyy, ContributionDate) < DATEPART(yyyy, GETDATE())
SELECT v.ID, v.[Benefactor Name], v.MaxContributionDate
FROM (
    SELECT b.ID, b.[Benefactor Name], mx.MaxContributionDate
    FROM benefactors b
    INNER JOIN (
        SELECT MAX([Contribution Date]) AS MaxContributionDate, [Benefactor ID]
        FROM contributions
        GROUP BY [Benefactor ID]
    ) mx ON (mx.[Benefactor ID] = b.ID)
) v
LEFT JOIN (
    SELECT DISTINCT [Benefactor ID]
    FROM contributions
    WHERE Year([Contribution Date]) = 2014
) t ON (t.[Benefactor ID] = v.ID) 
WHERE t.[Benefactor ID] IS NULL;