Sql 没有附加查询的答案吗?

Sql 没有附加查询的答案吗?,sql,sql-server,Sql,Sql Server,我的数据在两个表中。两个表格的格式如下: 我必须计算所有年龄在25到35岁之间的客户,从数据中可用的最大交易日期算起,这些客户在过去30天的交易中产生的净总收入是多少 我写了下面的代码 SELECT TOP 1 YEAR(T2.TRAN_DATE)[TRAN_YEAR] ,MONTH(T2.TRAN_DATE)[TRAN_Month], SUM(T2.Total_amt)[REVENUE] FROM TRANSACTIONS T2

我的数据在两个表中。两个表格的格式如下:

我必须计算所有年龄在25到35岁之间的客户,从数据中可用的最大交易日期算起,这些客户在过去30天的交易中产生的净总收入是多少

我写了下面的代码

SELECT      
TOP 1       YEAR(T2.TRAN_DATE)[TRAN_YEAR] ,MONTH(T2.TRAN_DATE)[TRAN_Month],
            SUM(T2.Total_amt)[REVENUE]  
FROM        TRANSACTIONS T2
RIGHT JOIN  CUSTOMER T1
ON          T1.CUSTOMER_ID = T2.CUST_ID
WHERE       DATEDIFF(YY, T1.DOB, GETDATE()) BETWEEN 25 AND 35
GROUP BY    YEAR(T2.TRAN_DATE),MONTH(T2.TRAN_DATE)
ORDER BY    YEAR(T2.TRAN_DATE) DESC, MONTH(T2.TRAN_DATE) DESC
我的查询是有效的,但当我在excel上计算相同的东西时,它给出了不同的答案


我无法找出我的错误。

我期待这样的查询:

SELECT SUM(T.Total_amt) as REVENUE] 
FROM TRANSACTIONS T JOIN
     CUSTOMER c
     ON c.CUSTOMER_ID = t.CUST_ID
WHERE c.DOB >= DATEADD(YEAR, -35, GETDATE()) AND
      c.DOB < DATEADD(YEAR, -24, GETDATE()) AND
      t.TRAN_DATE > DATEADD(DAY, -30, GETDATE());

请注意,这使用直接日期比较,而不是DATEDIFF。这些通常更准确。

我的查询有效,但当我在excel上计算相同的内容时,它给出了不同的答案。然后向我们展示您的Excel查询是什么。此外,作为一个FYI DATEDIFFYY,T1.DOB,25到35岁之间的GETDATE不会提供25到35岁(含25到35岁)的人的列表。你也会得到24岁的用户,而错过一些35岁的用户。避免正确的连接-它们可以工作,但比它们的价值更令人困惑。@Larnu谢谢你提供的信息。你能告诉我为什么它还包括一些24岁的数据,而遗漏了一些35岁的数据。你有没有更有效的方法来确定年龄。在excel中,我计算年龄[function Today-DOB from customer/365]应用vlookups从交易表到客户表获取收入和交易日期。在交易日应用年和月来过滤最大月份和年的数据。您能告诉我为什么它还包括一些24岁的数据,而遗漏了一些35岁的数据。但是,如果使用查询selectdatediffyy,'19941212',GETDATE,那么1994年12月12日出生的人今天将是24岁,2019年11月4日;您得到的结果为25,因此将包含在您的结果中。类似地,1983年12月12日出生的人今天将是35岁,但如果选择DATEDIFFYY,'19831212',GETDATE,将被排除在结果之外;返回36。@Larnu,这更有意义。如果必须的话,你会如何计算年龄呢?这是一个更好的方法,在有人指出我的方法不准确的原因后,我明白了。对于DATEADD,我得到了不同的答案,但它仍然与我在excel上计算的结果不符。问题要求从数据中可用的最大交易日期(而非当前日期)获取这些客户在过去30天的交易中产生的净总收入。无论如何,谢谢你的帮助@维那姆拉巴利。当一个问题有文本和一个不匹配的查询时,很难确定该相信哪一个。这就是为什么我在序言中提到我期待。