У вас есть что-то не так с вашим существующим запросом.
Во-первых, я не уверен, почему в вашем подзапросе вы используете GROUP BY на всех столбцах. Это не обязательно, если вы не знаете, что у вас есть дубликаты, которые вы не хотите в конечном результате.
Во-вторых, вы пытаетесь отобразить столбец [sum]
в окончательном списке выбора, но вы также агрегируете эти данные в PIVOT - Sum(IA.[Sum])
- вы не можете агрегировать данные и отображать это значение, если ваш подзапрос не имеет этого столбец, указанный дважды.
В-третьих, агрегация, используемая в PIVOT, ссылается на псевдоним таблицы IA
- этот псевдоним недоступен вне подзапроса, так что синтаксис также не будет работать.
Я хотел бы изменить ваш запрос, чтобы использовать следующее:
select [group], [number], [sum], DET, PLY, WTH
from
(
select [group], [number],
[sum],
[sum] pivsum, SOURCE
from dbo.Inter_App
) d
pivot
(
sum(pivsum)
for SOURCE in (DET, PLY, WTH)
) piv;
См SQL Fiddle with Demo. Вы заметите, что подзапрос имеет два столбца с [sum]
- один из них я дал псевдоним pivsum
- это будет использоваться для агрегации в PIVOT, другой столбец будет использоваться в окончательном списке выбора.
Наконец, вы заявили, что вы, возможно, неизвестное количество Source
значений, если это так, то вам нужно будет использовать динамический SQL для создания результата:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(SOURCE)
from Inter_App
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [group], [number],
[sum], ' + @cols + '
from
(
select [group], [number],
[sum],
[sum] pivsum, SOURCE
from dbo.Inter_App
) x
pivot
(
sum(pivsum)
for SOURCE in (' + @cols + ')
) p '
execute sp_executesql @query;
SQL Fiddle with Demo См. Обе версии дают результат:
| GROUP | NUMBER | SUM | DET | PLY | WTH |
|-------|--------|-------|--------|--------|--------|
| a | 1 | -2503 | (null) | (null) | -2503 |
| a | 2 | -180 | -180 | (null) | (null) |
| a | 3 | -156 | (null) | -156 | (null) |
| a | 4 | -99 | -99 | (null) | (null) |
| a | 5 | -252 | -252 | (null) | (null) |
Иногда у меня есть 2 строки с одинаковыми номерами, но один с SOURCE = DET, а другой с SOURCE = PLY. Как я мог объединить их на одной линии? –
Мое предложение, если у вас есть новый вопрос, а затем создайте новый со всеми требованиями для его решения. – Taryn