Для этого вам понадобится одна таблица без использования курсоров или динамического создания столбцов. Решение состоит в том, чтобы повернуть результаты, чтобы получить окончательный вывод
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
Помните, что я использую свои тестовые данные, поэтому вы можете добавить к ним, как вам нравится. Вот графический вывод всего:
Это звучит выполнимо, но страшно вы можете дать больше информации как WAHT вы пытаетесь сделать. Мы можем уйти с вставкой в общую временную таблицу, а затем поворот на основе месяца или даты. – JonH
ОК, у меня есть фигура, называемая «производство», из которой я показываю распределение по месяцам, согласно времени, названному «месяцем сбора урожая». пример: Производство => дата сбора урожая 100 => '2010/10/02' 200 => '2011/11/01' 100 => '2012/10/10' Результат набора будет be «Производство» => 2010-10 => = 2011-11> 2012-10 400 => 100 => 200 => 100 – ale
Я не верю, что у вас могут быть одинаковые имена столбцов. Каждый из них должен быть уникальным. Таким образом, вы должны иметь другое значение, чтобы убедиться, что у вас есть уникальное имя столбца. ИЛИ у вас может быть столбец Jan-Dec и Year, поэтому у вас будет 13 полных столбцов и одна строка в год (если это соответствует вашей модели). – Vinnie