Я создаю 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
, чтобы избежать дублирования в присоединяемой строке. Есть ли способ сделать это?
ПРИМЕЧАНИЕ. проблема не в конкатенации, а в конкатенации в оконной функции.
STUFF
+FOR XML
. Проблема здесь в том, чтобы объединить результаты вwindow function
. Пожалуйста, снова откройте. - person ttaaoossuuuu   schedule 24.01.2019STRING_AGG
, как вы это сделали. Вы не можете использовать функцию, которой нет в той версии SQL Server, которую вы используете, и поэтому решение — это то, что я пометил как дубликат. Вы должны использоватьSTUFF
иFOR XML PATH
. Вы не можете использоватьOVER
(иSTRING_AGG
) для создания списка с разделителями в SQL Server 2012. - person Larnu   schedule 24.01.2019STUFF
иFOR XML PATH
нельзя использовать сPARTITION BY
. Я попросил альтернативу, доступную в моей среде. И связанный ответ не дает этого. Извините, но предложение перейти на SQL Server 2017 равнозначно рассмотрению возможности смены работы. - person ttaaoossuuuu   schedule 24.01.2019STUFF
иFOR XML PATH
. Похоже, вы опускалиWHERE
в своем подзапросе. Это все еще очень много дубликатов. - person Larnu   schedule 24.01.2019