2011-03-03 75 views
0

在MSSQL中使用两个表:SQL - 限制按日期加入记录

一个表[CUSTOMER],其中包含有关捐助者的信息。 - 相关列:[CustID],[名称] 一张表[捐献],包含每次捐赠的记录。 - 相关列:[CustID],[金额],[日期] 这些表共享一个键[CustID]。

我想根据每个[客户ID]

SELECT DONATION.CUSTID 
,PEOPLE.NAME 
,SUM (DONATION.AMOUNT) as TOTAL_DONATION 
FROM [dbo].[DONATION] INNER JOIN [dbo].[PEOPLE] ON DONATION.CUSTID = PEOPLE.CUSTID 
GROUP BY 
DONATION.CUSTID 
,PEOPLE.NAME 
HAVING SUM (DONATION.AMOUNT) > 100 

这个查询来汇总[金额]工作正常,即使添加HAVING子句。

当我想限制捐款的日期聚集(添加到SELECT,GROUP BY和HAVING子句),但是...

SELECT DONATION.CUSTID 
,PEOPLE.NAME,DONATION.DATE 
,SUM (DONATION.AMOUNT) as TOTAL_DONATION 
    FROM [dbo].[DONATION] INNER JOIN [dbo].[PEOPLE] ON DONATION.CUSTID = PEOPLE.CUSTID 
    GROUP BY 
DONATION.CUSTID 
,PEOPLE.NAME 
,DONATION.DATE 
HAVING SUM (DONATION.AMOUNT) > 100 
and DONATION.DATE > '1-1-2010' 

查询不再返回总金额每个人的捐款,但返回个人捐款为每个人,符合HAVING标准。

如何执行此日期限制?我是如何加入或总结或....?谢谢。

回答

5

它移到WHERE子句

SELECT DONATION.CUSTID 
     ,PEOPLE.NAME 
     ,SUM (DONATION.AMOUNT) as TOTAL_DONATION 
FROM [dbo].[DONATION] 
INNER JOIN [dbo].[PEOPLE] ON DONATION.CUSTID = PEOPLE.CUSTID 
WHERE DONATION.DATE > '1-1-2010' 
GROUP BY 
     DONATION.CUSTID 
     ,PEOPLE.NAME 
HAVING SUM (DONATION.AMOUNT) > 100 

这意味着:

- given the people who donated 
- look only at data where donation date is in 2010 or later 
- and within that data, show the people who donated a total of more than 100 
+0

这与“HAVING”中的DONATION.DATE具有相同的效果。只有在特定日期之后才会报告捐款,但是没有像第一个查询那样正确汇总捐款。因此,不要总共捐赠超过100美元的捐款,它会报告个人捐款,从而为一些捐助者提供多个列表。 – JDV72 2011-03-03 19:31:32

+0

这样做,谢谢! – JDV72 2011-03-03 19:37:34

0

修改你的第一个查询,如:

,SUM (CASE WHEN DONATION.DATE > '1-1-2010' THEN DONATION.AMOUNT END) 
    as TOTAL_DONATION 
0

您不能按日期组除非每个客户每个日期需要一行。 如何从捐款表中完成并只查找客户名称?

选择捐赠者从= [捐赠] 其中[捐赠] 1”之间.date(从[人]其中[人] .custid = [捐赠] .custid名), 的CustID,SUM(量) /1/2011'和'1/15/2011' group by custid SUM(amount)> 100