2013-04-15 2 views
2

Может кто-нибудь дать мне некоторую помощь о том, как преобразовать Allocation таблицу к цели таблицу:хранимых процедур - Pivot, таблица преобразования головоломка

Распределение:

SA Project   From   TO  Allocation  Comment 
------------------------------------------------------------------------------- 
Bin  p1   2008-11-01  2008-11-30  0.3   a 
Bin  p1   2008-12-01  2008-12-31  0.3   a 
Bin  p1   2009-01-01  2009-01-31  0.3   a 
Bin  p1   2012-09-01  2012-09-30  0.5   b 
Bin  p1   2012-10-01  2012-10-31  0.5   b 
Bin  p1   2012-11-01  2012-11-30  0.5   b 
Bin  p1   2012-12-01  2012-12-31  0.5   b 
Mike p2   2011-09-01  2011-09-30  0.3   c 
Mike p2   2011-10-01  2011-10-31  0.3   c 
Mike p2   2011-11-01  2011-11-30  0.3   c 
Mike p2   2011-12-01  2011-12-31  0.3   c 
Mike p2   2012-01-01  2012-01-31  0.3   c 
Mike p2   2012-05-01  2012-05-31  0.6   c 
Mike p2   2012-06-01  2012-06-30  0.6   c 
Mike p2   2012-07-01  2012-07-31  0.6   c 
Mike p1   2011-10-01  2011-10-31  0.45   d 
Mike p1   2011-11-01  2011-11-30  0.45   d 
Mike p1   2011-12-01  2011-12-31  0.45   d 
Mike p1   2012-10-01  2012-10-31  0.32   d 
Mike p1   2012-11-01  2012-11-30  0.32   d 
Mike p1   2012-12-01  2012-12-31  0.32   d 

== ================================================== ============================

T Arget:

Пожалуйста, обратите внимание, что ноябрь декабрь в предыдущем году, как Jan Feb ... окт в

SA Project Year Nov Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Comment Total 
--------------------------------------------------------------------------------------- 
Bin p1 2008 0.3 0.3 0.3 0 0 0 0 0 0 0 0 0  a  0.9 
Bin p1 2011 0 0 0 0 0 0 0 0 0 0 0.5 0.5 b  1 
Bin p1 2012 0.5 0.5 0 0 0 0 0 0 0 0 0 0  b  1 

Total    0.8 0.8 0.3 0 0 0 0 0 0 0 0.5 0.5   2.9 

Mike p1 2010 0 0 0 0 0 0 0 0 0 0 0 0.45 d  0.45 
Mike p1 2011 0.45 0.45 0 0 0 0 0 0 0 0 0 0.32 d  1.22 
Mike p1 2012 0.32 0.32 0 0 0 0 0 0 0 0 0 0  d  0.64 
Mike p2 2010 0 0 0 0 0 0 0 0 0 0 0.3 0.3 c  0.6 
Mike p2 2011 0.3 0.3 0.3 0 0 0 0.6 0.6 0.6 0 0 0  c  2.7 

Total    1.07 1.07 0.3 0 0 0 0.6 0.6 0.6 0 0.3 1.07   5.61 

Теперь я могу получить Текущий таблицу:.

Ток:

Я могу сделать только янв фев ... декабрь в том же году. Не знаю, как сделать их в течение двух лет подряд, начиная с ноября прошлого года.

SA Project Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Comment 
---------------------------------------------------------------------------------------- 
Bin p1 2008 0 0 0 0 0 0 0  0 0  0 0.30 0.30 a 
Bin p1 2009 0.30 0 0 0 0 0 0  0 0  0  0 0  a 
Bin p1 2012 0 0 0 0 0 0 0  0 0.50 0.50 0.50 0.50 b 
Mike p1 2011 0 0 0 0 0 0 0  0 0 0.45 0.45 0.45 d 
Mike p1 2012 0 0 0 0 0 0 0  0 0 0.32 0.32 0.32 d 
Mike p2 2011 0 0 0 0 0 0 0  0 0.30 0.30 0.30 0.30 c 
Mike p2 2012 0.30 0 0 0 0.60 0.60 0.60 0 0  0  0  0  c 

Ключевая проблема заключается в том, чтобы tranform таблицы Текущего в целевой таблицы. В таблице Target, например, 2008 Nov Dec и 2009 Jan Feb Mar Apr May Jun Jul Aug Sep Oct должен отображаться в той же строке. Кроме того, добавляется сумма каждого столбца и сумма каждой строки shuld.

Любое предложение приветствуется.

Будет очень признателен, если кто-то может помочь мне достичь этого.

Thakns заранее.

+0

Почему 2008 ноябрь декабрь и 2009 Январь Февраль Март Апрель Май Июнь Июль Август Сен Окт должен отображаться в том же ряду и где Год 2011 для Bin/p1? –

+0

Привет, Александр, в Целевой таблице, С начала Месяц - Ноябрь, а Ян в той же строке будет в следующем году. Таким образом, столбец «Год» означает начало года. Хорошие вопросы – user2275101

+0

Привет, Александр, в целевой таблице начальный месяц - ноябрь, поэтому у нас (2008 Nov Dec) и (2009 Jan Feb ... Sep Oct). Вот почему у вас есть год 2011 для Bin/p1 в таблице Target. Теперь я могу отображать только те 12 месяцев в том же году, что и в текущей таблице. Ключ состоит в том, чтобы отобразить эти два последовательных 12 месяца, начиная с ноября до следующего года в октябре и суммировать эти распределения. Надеюсь, вы поняли, что я имею в виду. – user2275101

ответ

0

Полное платежное решение, вы можете проверить код и проверить его на SQLFiddle Demo, и я собираюсь привести краткое объяснение ниже кода.

SQLFiddle Demo

;WITH 
CTE_Pivot AS 
(
    SELECT 
     SA 
     ,Project 
     ,CASE WHEN MONTH([FROM]) <11 THEN YEAR([FROM])-1 ELSE YEAR([From]) END AS YEAR 
     ,CASE WHEN MONTH([FROM]) = 11 THEN Allocation ELSE 0 END AS Nov 
     ,CASE WHEN MONTH([FROM]) = 12 THEN Allocation ELSE 0 END AS [Dec] 
     ,CASE WHEN MONTH([FROM]) = 1 THEN Allocation ELSE 0 END AS Jan 
     ,CASE WHEN MONTH([FROM]) = 2 THEN Allocation ELSE 0 END AS Feb 
     ,CASE WHEN MONTH([FROM]) = 3 THEN Allocation ELSE 0 END AS Mar 
     ,CASE WHEN MONTH([FROM]) = 4 THEN Allocation ELSE 0 END AS Apr 
     ,CASE WHEN MONTH([FROM]) = 5 THEN Allocation ELSE 0 END AS May 
     ,CASE WHEN MONTH([FROM]) = 6 THEN Allocation ELSE 0 END AS Jun 
     ,CASE WHEN MONTH([FROM]) = 7 THEN Allocation ELSE 0 END AS Jul 
     ,CASE WHEN MONTH([FROM]) = 8 THEN Allocation ELSE 0 END AS Aug 
     ,CASE WHEN MONTH([FROM]) = 9 THEN Allocation ELSE 0 END AS Sep 
     ,CASE WHEN MONTH([FROM]) = 10 THEN Allocation ELSE 0 END AS Oct 
     ,Allocation 
     ,Comment 
    FROM dbo.Allocation 
) 
,CTE_Rollup AS 
(
    SELECT SA, Project, YEAR 
     ,SUM(Nov) AS Nov 
     ,SUM(Dec) AS Dec 
     ,SUM(Jan) AS Jan 
     ,SUM(Feb) AS Feb 
     ,SUM(Mar) AS Mar 
     ,SUM(Apr) AS Apr 
     ,SUM(May) AS May 
     ,SUM(Jun) AS Jun 
     ,SUM(Jul) AS Jul 
     ,SUM(Aug) AS Aug 
     ,SUM(Sep) AS Sep 
     ,SUM(Oct) AS Oct 
     ,MAX(Comment) AS Comment 
     ,SUM(Allocation) AS Total 
    FROM CTE_Pivot 
    GROUP BY SA, Project, YEAR WITH ROLLUP 
) 
SELECT 
    CASE WHEN YEAR IS NULL THEN 'Total' ELSE SA END AS SA 
    ,CASE WHEN YEAR IS NULL THEN NULL ELSE Project END AS Project 
    ,YEAR 
    ,Nov,Dec,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct 
    ,CASE WHEN YEAR IS NULL THEN NULL ELSE Comment END AS Comment 
    ,Total 
FROM CTE_Rollup 
WHERE SA IS NOT NULL AND (YEAR IS NOT NULL OR YEAR IS NULL AND Project IS NULL) 

Первый КТР для поворота данных и создавать столбцы ноября, декабрь и т.д. Данные здесь еще не сгруппированных. Существует отдельная строка для каждой исходной строки, имеющей значения всего за один месяц, и нули в другом. Размещение ян-октябрьских месяцев в следующем году достигается с помощью простого заявления CASE (год + 1, когда месяц < 11).

Второй CTE группирует данные и с помощью WITH WITH ROLLUP намекает на создание промежуточных итогов. Он возвращает почти то, что вы хотите, с несколькими дополнительными строками (промежуточные итоги по каждой SA, комбинации проектов, каждому SA и грандиозным итоговым значениям).

Заключительный запрос просто удаляет эти строки и форматирует несколько строк и столбцов в соответствии с вашей целевой таблицей.

Обратите внимание, что у меня не было SQL Server 2005 на моей руке, чтобы проверить это, но я почти уверен, что он должен работать нормально

EDIT: SQLFiddle for updated version with blank rows before and after totals

+0

Ненад, сейчас я читаю ваше сообщение. Это выглядит правильно и работает для меня. Я скоро вернусь к вам. – user2275101

+0

Утренняя Ненад, я думаю, вы близки, но еще нет. Мне плохо, что мой вопрос непонятен. Пожалуйста, посмотрите обновленный вопрос выше, выполнив ваше решение, я получаю другой вариант из таблицы Target. Спасибо за вашу помощь – user2275101

+0

@ user2275101 Ну, это 4 вечера, где я живу, но доброе утро вам тоже сэр (или ma'm) :) ОК. Я обновил ответ с измененными запросами. Речь шла только об этих дополнительных рядах, удаляющихся в конце. Кроме того, я внес некоторые изменения в первую группу CTE, и вообще не было необходимости и было предложено новую скрипту. –