SQL根据最新日期选择行,包括较旧日期的总和?

SQL根据最新日期选择行,包括较旧日期的总和?,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个复杂的问题。这是简短的版本。也许如果我能得到一点帮助,我就不需要更多的帮助了 无论如何,假设我有一个表,其中有几行示例: CustNum - CustName - Salesman - Address - SoldTotal - SaleDate a500 - bubby's - 03 - 123 Street - $254 - 03-13-2013 a500 - bubby's - 22 - 123 Street - $996 - 05-12-2013 a500 - bubby's -

我有一个复杂的问题。这是简短的版本。也许如果我能得到一点帮助,我就不需要更多的帮助了

无论如何,假设我有一个表,其中有几行示例:

CustNum - CustName - Salesman - Address - SoldTotal - SaleDate
a500 - bubby's - 03 - 123 Street - $254 - 03-13-2013
a500 - bubby's - 22 - 123 Street - $996 - 05-12-2013
a500 - bubby's - 13 - 123 Street - $1001 - 09-20-2013
b100 - squirrely's - 14 - 456 Street - $460 - 03-14-2013
老板想要的是一份清单,其中包括每个买家的一行、最近的销售人员以及总销售额。上面的理想输出是(日期可用于比较目的,但他不想在报告中显示):


如何才能最好地实现这一点?我尝试了一个自连接,试图比较日期,但我得到了一个算术溢出。我一定是把措辞弄错了。有什么想法吗

下面是一个使用行数和总和窗口函数的示例:

with SampleData (CustNum, CustName, Salesman, Address,  SoldTotal, SaleDate ) as (
    select 'a500', 'bubbys', '03', '123 Street', 254, '03-13-2013' union all
    select 'a500', 'bubbys', '03', '123 Street', 996, '05-12-2013' union all
    select 'b100', 'squirrelys', '14', '456 Street', 460, '03-14-2013'
)
select CustNum, CustName, MostRecentSalesman, SoldTotal
from (
    select
        CustNum
    ,   CustName
    ,   MostRecentSalesman = Salesman
    ,   rn = row_number() over (partition by CustNum order by SaleDate desc)
    ,   SoldTotal = sum(soldTotal) over (partition by CustNum)
    from SampleData
) x
where x.rn = 1

最初的“with SampleData…”部分只是有一些样本数据用于编写查询。

下面是一个使用行数和总和窗口函数的示例:

with SampleData (CustNum, CustName, Salesman, Address,  SoldTotal, SaleDate ) as (
    select 'a500', 'bubbys', '03', '123 Street', 254, '03-13-2013' union all
    select 'a500', 'bubbys', '03', '123 Street', 996, '05-12-2013' union all
    select 'b100', 'squirrelys', '14', '456 Street', 460, '03-14-2013'
)
select CustNum, CustName, MostRecentSalesman, SoldTotal
from (
    select
        CustNum
    ,   CustName
    ,   MostRecentSalesman = Salesman
    ,   rn = row_number() over (partition by CustNum order by SaleDate desc)
    ,   SoldTotal = sum(soldTotal) over (partition by CustNum)
    from SampleData
) x
where x.rn = 1
;WITH x AS 
(
  SELECT CustNum, CustName, SalesMan, Address, 
    s = SUM(SoldTotal) OVER (PARTITION BY CustNum),
    r = ROW_NUMBER() OVER (PARTITION BY CustNum ORDER BY SaleDate DESC)
  FROM dbo.YourTable
)
SELECT CustNum, CustName, SalesMan, Address, SoldTotal = s
  FROM x
  WHERE r = 1;
最初的“with SampleData…”部分只是为了有一些样本数据来编写查询

;WITH x AS 
(
  SELECT CustNum, CustName, SalesMan, Address, 
    s = SUM(SoldTotal) OVER (PARTITION BY CustNum),
    r = ROW_NUMBER() OVER (PARTITION BY CustNum ORDER BY SaleDate DESC)
  FROM dbo.YourTable
)
SELECT CustNum, CustName, SalesMan, Address, SoldTotal = s
  FROM x
  WHERE r = 1;


这是SQL Server吗?窗口功能在这里可以很好地工作……您知道,如果您可以提供SQL来创建带有示例行的表,或者将其作为csv文件提供,这将非常有用。然后,基于您的问题编写查询变得更容易。或者在上设置一个示例。这是SQL Server吗?窗口功能在这里可以很好地工作……您知道,如果您可以提供SQL来创建带有示例行的表,或者将其作为csv文件提供,这将非常有用。然后,基于您的问题编写查询变得更容易。或者在上设置一个示例。这可能会起作用。。。如何删除输出中的“rn”列?编辑后就是为了这样做,现在它缺少
地址
。这可能会起作用。。。如何删除输出中的“rn”列?编辑后就是为了这样做,现在它缺少
地址