尝试使用Partition By和Row_Number进行数学求和

时间:2015-02-23 01:58:49

标签: sql sybase-iq

我试图在我的桌子上添加几个栏目,我在那里的方式有点但不清楚为什么它会失败。这是一个示例起始表...

Date        Name    Amount
1/2/2015    Andy    148
2/5/2015    Andy    188
2/11/2015   Andy    154
1/15/2015   John    136
2/5/2015    John    176
1/7/2015    John    134
1/19/2015   John    251
2/21/2015   Carlos  120
2/15/2015   Carlos  211
1/8/2015    Carlos  120
1/2/2014    Andy    151
2/5/2014    Andy    281
2/11/2014   Andy    298 
1/15/2014   John    292
2/5/2014    John    134 
1/7/2014    John    281
1/19/2014   John    101
2/21/2014   Carlos  137
2/15/2014   Carlos  108
1/8/2014    Carlos  292

我想采取上表并......

1)按年份,名称,然后按值排序 2)基于#1,添加" Ordered"列,为每组Year和Name提供一个数字,其中Value按升序排序 3)乘以的列乘以有序的金额 4)将相乘的列与每个集合的总和相加

结果...

Date    Year    Name    Amount  Ordered   Multiplied    Sum
1/2/2014    2014    Andy    151      1           151    1607
2/5/2014    2014    Andy    281      2           562    1607
2/11/2014   2014    Andy    298      3           894    1607
2/15/2014   2014    Carlos  108      1           108    1258
2/21/2014   2014    Carlos  137      2           274    1258
1/8/2014    2014    Carlos  292      3           876    1258
1/19/2014   2014    John    101      1           101    2380 
2/5/2014    2014    John    134      2           268    2380
1/7/2014    2014    John    281      3           843    2380
1/15/2014   2014    John    292      4           1168   2380
1/2/2015    2015    Andy    148      1           148    1020
2/11/2015   2015    Andy    154      2           308    1020
2/5/2015    2015    Andy    188      3           564    1020
1/8/2015    2015    Carlos  120      1           120    993
2/21/2015   2015    Carlos  120      2           240    993
2/15/2015   2015    Carlos  211      3           633    993
1/7/2015    2015    John    134      1           134    1938
1/15/2015   2015    John    136      2           272    1938
2/5/2015    2015    John    176      3           528    1938
1/19/2015   2015    John    251      4          1004    1938

除了最后一栏,我还有其他所有内容,因为我一直收到错误...

' Row_Number'附近的表达式无效。

用于' Ordered' ...

的SQL
ROW_NUMBER() OVER ( Partition BY Name, DATEPART(YEAR, Date) ORDER BY Amount ) AS 'Ordered'

SQL for' Multiplied' ...

 Amount * Ordered AS Multiplied

现在我可以天真地想到这个,但我想我可以添加这样的一行......

sum(Multiplied) OVER ( Partition BY Name, DATEPART(YEAR, Date) ORDER BY Amount ) AS 'Sum'

但我不断收到提到的错误。任何想法如何处理?我很高兴听到其他处理数据的方法。我只关心最后一栏

1 个答案:

答案 0 :(得分:1)

如果您的语法有效,它会产生累积总和。这似乎不是你想要的。

我认为你可以用子查询做你想做的事情:

select t.*,
        (seqnum * amount) as multiplied,
        sum(seqnum * amount) over (partition by name, year(date)) as thesum
from (select t.*,
             row_number() over (partition by name, year(date) order by date) as seqnum
      from table t
     ) t;