2015-02-23 2 views
0

Я пытаюсь добавить несколько столбцов в таблицу, и я немного по-другому, но не понимаю, почему это происходит. Это стартовый стол пример ...Пытаясь сделать математическую сумму, используя Partition By и Row_Number

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, Добавить «упорядоченная» колонна, которая дает ряд для каждого набора года и названия, где значение устанавливается отсортированным по возрастанию 3) столбец Multiplied множится суммой упорядоченного 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.

SQL для 'Заказал' ...

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

SQL для 'Умножить' ...

Amount * Ordered AS Multiplied 

Теперь я мог бы думать об этом наивно, но я думал, что я мог бы просто добавить a line, подобный этой ...

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

Но я продолжаю упоминать об ошибке. Любые идеи, как обращаться? Я могу услышать другие способы обработки данных. Меня интересует только последняя колонка

ответ

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; 
+0

Спасибо за этот Гордон! Это сработало. Я думаю, вы хотели обозначить пятую строчку как «seqnum». Это отбросило меня на секунду, но потом поняло, что вы имели в виду. Я добавил порядок в строке суммы, чтобы упорядочить наборы порядковым номером, но независимо от того, какие продукты и итоги были правильными. Спасибо! – cpd1

Смежные вопросы