2013-12-02 7 views
2

я следующая таблица ...SQL Server 2008 сводной таблицы

GROUP Number Sum  SOURCE 
a   1 -2503 WTH 
a   2 -180 DET 
a   3 -156 PLY 
a   4 -99  DET 
a   5 -252 DET 

который я хотел бы представить следующим образом ...

GROUP Number Sum  DET PLY  WTH 
a   1 -2503     -2503 
a   2 -180 -180   
a   3 -156   -156 
a   4 -99  -99  
a   5 -252 -252   

Вот что я пытался (безуспешно) с помощью PIVOT ...

SELECT 
    [GROUP] 
    ,Number 
    ,Opening_Val 
    ,[Sum] 
    ,DET 
    ,PLY 
    ,WTH 
FROM 
(SELECT 
    IA.GROUP_CD 
    ,IA.Number 
    ,IA.[sum] 
    ,Src 
FROM dbo.##Inter_App IA 
GROUP BY IA.[GROUP] 
    ,IA.Number 
    ,IA.[sum] 
    ,Src) query 
PIVOT 
( Sum(IA.[Sum]) 
    For Src in (DET, PLY, WTH) 
) pvt 

в идеале, я хотел, чтобы не ограничивать столбцы (DET, PLY, WTH), а может быть и больше Источника, что я не ав являются из.

Любая помощь приветствуется.

Спасибо, Джеймс

+0

Иногда у меня есть 2 строки с одинаковыми номерами, но один с SOURCE = DET, а другой с SOURCE = PLY. Как я мог объединить их на одной линии? –

+0

Мое предложение, если у вас есть новый вопрос, а затем создайте новый со всеми требованиями для его решения. – Taryn

ответ

1

Вы сделали вашу попытку слишком сложно :). Кроме того, выберите другие имена для своих столбцов вместо суммы, группы и числа, поскольку не только это ключевые слова sql-синтаксиса, но и затрудняет чтение запросов (например, sum ([sum]), group by [group]). ,

drop table #temp 
GO 
select 
    * 
into #temp 
from (
    select 'a' as [group],1 as [number],'-2503' as [sum],'WTH' as [source] union all 
    select 'a',2,-180,'DET' union all 
    select 'a',3,-156,'PLY' union all 
    select 'a',4,-99,'DET' union all 
    select 'a',5,-252,'DET' 
) x 
GO 

select 
    [group], [number], 
    det, ply, wth 
from #temp 
pivot (
    sum([sum]) for [source] in (det,ply,wth) 
) x 
6

У вас есть что-то не так с вашим существующим запросом.

Во-первых, я не уверен, почему в вашем подзапросе вы используете 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) | 
+0

спасибо за ваш очень четкий ответ. к сожалению, мне не хватает репутации +1 к вам. Джеймс. –

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