SQL Server 12: создать поле с разделителями-запятыми в OVER PARTITION BY

Я создаю SQL-запрос для группировки и агрегирования данных. Результат должен содержать сумму для двух десятичных полей и поля varchar с разделителями-запятыми:

┌────┬───────────────┬─────────────┬──────────┬────────┬─────┬─────────────┐
│ Id │ InvoiceNumber │ InvoiceDate │ SellerId │ Amount │ Tax │ InvoiceType │
├────┼───────────────┼─────────────┼──────────┼────────┼─────┼─────────────┤
│  1 │ a-001         │ 2019-01-11  │        1 │     10 │   2 │ Regular     │
│  2 │ a-002         │ 2019-01-12  │        1 │     10 │   2 │ Regular     │
│  3 │ a-003         │ 2019-01-13  │        1 │     10 │   2 │ Special     │
│  4 │ a-004         │ 2019-01-14  │        2 │     10 │   2 │ Regular     │
│  5 │ a-005         │ 2019-01-15  │        2 │     10 │   2 │ Regular     │
│  6 │ a-006         │ 2019-01-16  │        3 │     10 │   2 │ Special     │
└────┴───────────────┴─────────────┴──────────┴────────┴─────┴─────────────┘

Желаемый результат:

┌────┬───────────────┬──────────┬───────────┬────────┬─────┬─────────────────┐
│ Id │ InvoiceNumber │ SellerId │ RowNumber │ Amount │ Tax │   InvoiceType   │
├────┼───────────────┼──────────┼───────────┼────────┼─────┼─────────────────┤
│  3 │ a-003         │        1 │         1 │     30 │   6 │ Regular,Special │
│  5 │ a-005         │        2 │         1 │     20 │   4 │ Regular         │
│  6 │ a-006         │        3 │         1 │     10 │   2 │ Special         │
└────┴───────────────┴──────────┴───────────┴────────┴─────┴─────────────────┘

До сих пор я пробовал:

SELECT [Id],
    [InvoiceNumber],
    [SellerId],
    ROW_NUMBER() OVER (PARTITION BY [SellerId] ORDER BY [InvoiceDate] DESC) AS [RowNumber],
    SUM([Amount]) OVER (PARTITION BY [SellerId]) AS [Amount], 
    SUM([Tax]) OVER (PARTITION BY [SellerId]) AS [Tax],
    STRING_AGG([InvoiceType], ',')
        OVER (PARTITION BY [SellerId] ORDER BY [InvoiceType]) AS [InvoiceTypes]
FROM [Invoices]
WHERE [RowNumber] = 1

Однако это не работает в SQL Server 2012, поскольку он не поддерживает функцию STRING_AGG(). Кроме того, мне нужны значения DISTINCT, чтобы избежать дублирования в присоединяемой строке. Есть ли способ сделать это?

ПРИМЕЧАНИЕ. проблема не в конкатенации, а в конкатенации в оконной функции.


person ttaaoossuuuu    schedule 24.01.2019    source источник
comment
Это не дубликат результатов, разделенных запятыми, в SQL, я знаю трюк STUFF + FOR XML. Проблема здесь в том, чтобы объединить результаты в window function. Пожалуйста, снова откройте.   -  person ttaaoossuuuu    schedule 24.01.2019
comment
Затем вам нужно перейти на SQL Server 2017 и использовать STRING_AGG, как вы это сделали. Вы не можете использовать функцию, которой нет в той версии SQL Server, которую вы используете, и поэтому решение — это то, что я пометил как дубликат. Вы должны использовать STUFF и FOR XML PATH. Вы не можете использовать OVERSTRING_AGG) для создания списка с разделителями в SQL Server 2012.   -  person Larnu    schedule 24.01.2019
comment
STUFF и FOR XML PATH нельзя использовать с PARTITION BY. Я попросил альтернативу, доступную в моей среде. И связанный ответ не дает этого. Извините, но предложение перейти на SQL Server 2017 равнозначно рассмотрению возможности смены работы.   -  person ttaaoossuuuu    schedule 24.01.2019
comment
Потому что вам нужно использовать коррелированный подзапрос, который по-прежнему является частью решения STUFF и FOR XML PATH. Похоже, вы опускали WHERE в своем подзапросе. Это все еще очень много дубликатов.   -  person Larnu    schedule 24.01.2019
comment
Рекурсивный CTE может использоваться для получения значений, разделенных запятыми, а затем может быть объединен с набором результатов.   -  person Dheerendra    schedule 24.01.2019