2014-12-22 6 views
0

кто-то может помочь с запросом по приводимым нижеSQL запросов к Транспонирование столбцов в строки

Возврат Таблица

Id  Factor monthlyReturns price date 

A1  0.2  0.001   2010-01-29 
A1  0.2  0.003   2010-02-26 
A1  0.2  0.004   2010-03-31 
A1  0.2  0.004   2010-04-30 
A2  0.1  0.001   2010-01-29 
A2  0.1  0.001   2010-02-26 
A2  0.1  0.001   2010-03-31 
A2  0.1  0.001   2010-04-30 
A3  0.3  0.03   2010-01-29 
A3  0.3  0.04   2010-02-26 
A3  0.3  0.05   2010-03-31 
A3  0.3  0.05   2010-04-30 
A4  0.4  0.12   2010-01-29 
A4  0.4  0.12   2010-02-26 
A4  0.4  0.14   2010-03-31 
A4  0.4  0.15   2010-04-30 

Я хочу, чтобы преобразовать эти данные в следующем формате .Can кто-то пожалуйста, предложите запрос

  A1  A2  A3  A4  Total 
31-Jan-10 0.001 0.001 0.03 0.12  0.001*0.2(Factor for A1)+0.001*0.1(Factor forA2)+ 
              0.03*0.3(Factor forA3)+ 0.12*0.4(Factor forA4) 

28-Feb-10 0.003 0.001 0.04 0.12  Same as above 
31-Mar-10 0.004 0.001 0.05 0.14  Same as above 
30-Apr-10 0.004 0.001 0.05 0.15  Same as above 

Благодаря

+0

показать sql please –

+2

PIVOT - это ключевое слово, которое вы ищете. Но вы должны ЗНАТЬ значения, если нет, вам придется использовать динамический SQL. В стек уже несколько примеров: http://stackoverflow.com/questions/16417484/tsql-complex-pivot для одного. – xQbert

+0

Во входных данных нет 31-янв-10. Как появилась такая дата в выходных данных? –

ответ

1

ниже запрос вы просили, обратите внимание, что вы необходимо изменить имя таблицы на ваш.

немного пояснение: Я предположил, что идентификаторы ограничены A1, A2, A3, A4. иначе это не сработает, и вам понадобится более сложное решение.

первым я создал общее табличное выражение в повернутой таблице со всеми факторами, сгруппированных по дате (при условии, что не может быть два фактора такого же идентификатор на ту же дату)

тогда, я присоединиться к этому с сводная таблица, которая содержит все ежемесячные доходы.

примечание: я использовал функцию суммы в полях A1, A2, .. так как мне нужно было группировать ее по дате, и выбор может использовать только функцию агрегата, если столбец не находится в предложении group by. это не влияет на значения, так как у вас есть только одна строка для каждого идентификатора в определенную дату, но исправьте меня, если я ошибаюсь.

with FactorsByDate(PriceDate,FactorA1,FactorA2,FactorA3,FactorA4) 
AS 
(
    SELECT [price date] AS Date, 
    SUM([A1]) AS A1, SUM([A2]) AS A2, SUM([A3]) AS A3, SUM([A4]) AS A4 
    FROM 
    (SELECT Id, Factor , [price date] 
    FROM TempTbl) AS SourceTable 
    PIVOT 
    (
    SUM(Factor) 
    FOR Id IN ([A1], [A2], [A3], [A4]) 
    ) AS PivotTable 
    group by [price date] 
) 
SELECT Date,A1,A2,A3,A4, A1*FactorA1 + A2*FactorA2 + A3*FactorA3 + A4*FactorA4 AS Total 
FROM 
(
    SELECT [price date] AS Date, 
    SUM([A1]) AS A1, SUM([A2]) AS A2, SUM([A3]) AS A3, SUM([A4]) AS A4 
    FROM 
    (SELECT Id, monthlyReturns , [price date] 
    FROM TempTbl) AS SourceTable 
    PIVOT 
    (
    SUM(monthlyReturns) 
    FOR Id IN ([A1], [A2], [A3], [A4]) 
    ) AS PivotTable 
    group by [price date] 
) AS monthlyReturns 
INNER JOIN FactorsByDate ON FactorsByDate.PriceDate = monthlyReturns.Date 
+0

Большое спасибо за вашу помощь. Он работал! – user1143726

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