2012-01-23 2 views
1

Мне нужно сопоставить столбцы в соответствии с количеством месяцев, предшествующих вычитанию между двумя датами.Назначение динамических столбцов через SQL?

Пример: 2012-10-01 - 2010-10-01 = 24

мне нужно выделить 24 столбцов (вставить во временную таблицу), с именами всех месяцев между 01.10.2012 и 01.10.2010 => октябрь, ноябрь, ... .. Октябрь.

Каждый столбец представляет месяц, как это:

Октябрь Ноябрь Декабрь Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь

table_Temporal

City  
Area  
Production => Oct,Nov,Dec...etc... 
Yield 

ОК, у меня есть фигура, называемая «производство», из которой я показываю распределение по месяцам, согласно времени, называемому «месяцем уборка урожая."

пример:

Производство => дата сбора урожая 100 => '2010/10/02' 200 => '2011/11/01' 100 => '2012/10/10'

Результирующий набор будет

enter image description here

Любые предложения?

+1

Это звучит выполнимо, но страшно вы можете дать больше информации как WAHT вы пытаетесь сделать. Мы можем уйти с вставкой в ​​общую временную таблицу, а затем поворот на основе месяца или даты. – JonH

+0

ОК, у меня есть фигура, называемая «производство», из которой я показываю распределение по месяцам, согласно времени, названному «месяцем сбора урожая». пример: Производство => дата сбора урожая 100 => '2010/10/02' 200 => '2011/11/01' 100 => '2012/10/10' Результат набора будет be «Производство» => 2010-10 => = 2011-11> 2012-10 400 => 100 => 200 => 100 – ale

+0

Я не верю, что у вас могут быть одинаковые имена столбцов. Каждый из них должен быть уникальным. Таким образом, вы должны иметь другое значение, чтобы убедиться, что у вас есть уникальное имя столбца. ИЛИ у вас может быть столбец Jan-Dec и Year, поэтому у вас будет 13 полных столбцов и одна строка в год (если это соответствует вашей модели). – Vinnie

ответ

1

Для этого вам понадобится одна таблица без использования курсоров или динамического создания столбцов. Решение состоит в том, чтобы повернуть результаты, чтобы получить окончательный вывод

2010-10 2010-11 2010-12 2011-1... 
    50  100  25  70 

То есть комбинация года и месяца, что делает столбец уникальным и сумма производятся в течение всего месяца и помещена в правильной колонке. Одна из проблем, которая возникла быстро, заключается в том, что при использовании PIVOT вам нужно указать имена столбцов. Например, ... PIVOT (SUM(Harvest)) FOR ([2011-10], [2011-11]..., но мы можем избежать этого все вместе с использованием STUFF и XML Path.

Вот что вы можете сделать, я использовал таблицы TEMP, но вы можете изменить это, чтобы ссылаться на реальные таблицы.Первая таблица:

CREATE TABLE #Test 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    TheDate datetime, 
    Harvest int 
) 

Затем вставьте фиктивный данные:

INSERT INTO #Test(TheDate, Harvest) VALUES ('10/11/2011', 50) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('10/11/2012', 100) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('10/1/2011', 20) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('12/11/2011', 50) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('11/11/2011', 50) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('11/12/2011', 150) 

Показать результаты:

SELECT * FROM #Test 

Результат является:

ID TheDate     Harvest 
1 2011-10-11 00:00:00.000 50 
2 2012-10-11 00:00:00.000 100 
3 2011-10-01 00:00:00.000 20 
4 2011-12-11 00:00:00.000 50 
5 2011-11-11 00:00:00.000 50 
6 2011-11-12 00:00:00.000 150 

Вот где магия происходит:

DECLARE @listCol VARCHAR(2000) 
DECLARE @query VARCHAR(4000) 

SELECT @listCol = STUFF(( 
          SELECT DISTINCT 
          ],[' + ltrim(str(YEAR(TheDate))) + 
          '-' + CAST (MONTH(TheDate) as varchar(50)) 
          FROM  
        #Test 
        ORDER BY 
       '],[' + ltrim(str(YEAR(TheDate))) + '-' + 
          CAST(MONTH(TheDate) as varchar(50)) 
          FOR XML PATH('') 
            ), 1, 2, '') + ']' 
SET @query = 
'SELECT * FROM 
     (SELECT 
      ltrim(str(YEAR(TheDate))) + 
      ''-'' + CAST (MONTH(TheDate) as varchar(50)) AS TheCol, 
      Harvest 
      FROM 
      #Test 
      ) src 
     PIVOT (SUM(Harvest) FOR TheCol 
     IN ('[email protected]+')) AS pvt' 

Затем выполнить этот запрос:

EXECUTE (@query)

Результат:

2011-10 2011-11  2011-12 2012-10 
70   200   50 100 

И не забудьте избавиться от временной таблицы

DROP TABLE #Test

Помните, что я использую свои тестовые данные, поэтому вы можете добавить к ним, как вам нравится. Вот графический вывод всего:

enter image description here

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