динамический SQL-сервер в SQL Server - PullRequest
1 голос
/ 30 ноября 2011

Выполнение этого запроса в SQL Server 2008 сейчас, но в ближайшее время планируем перенести его в создание отчета в службах отчетов SQL:

SELECT * from ( SELECT Amount, Year, column1, column2,column3 from BUYSCTE ) BUY 

Результаты моей таблицы, выполняющиеся над запросом без сводки, следующие:

Column1 | Column2 | Column3| FYYear| Amount|

 1           cat     dog      2011   50 
 1           cat     dog      2012   75
 1           cat     dog      2013   65
 2          fish     snake    2011   23
 2          fish     snake    2012   39
 2          fish     snake    2013   59
 .. 
 ..  
 ..                           2016

так что в основном я хочу, чтобы результаты заканчивались так:

Column1 | Column2 | Column3| 2011| 2012 | 2013 
 1           cat     dog      50    75     65
 2          fish     snake    23    39     59

Итак, запрос, который я предложил, чтобы это произошло, - я сначала создал табличную переменную, сделал ее динамической переменной и сделал такой вот разворот,

declare @Year nvarchar(Max)
set @Year = STUFF(
(SELECT ', ' + quotename(FYYear)
from BUYSCTE Group By FYYear order by
FYYear For XML PATH(''))
, 1, 2, '');

Вышеуказанное значение заполняется значением @Year: [2011], [2012], [2013], [2014], [2015], [2016]

Я знаю, что, поскольку я изменяю выше, выберите SELECT @Year, чтобы проверить, правильно ли установлено значение

оттуда я изменяю вышеупомянутый выбор после табличной переменной на

SELECT * from ( SELECT Amount, FYYear, column1, column2,column3 from BUYSCTE ) BUY 
PIVOT( SUM(Amount) FOR FYYear in ([@Year]) ) pvt

но мои результаты в итоге становятся такими

 Column1 | Column2 | Column3| @Year|
 1           cat     dog      null   
 2          fish     snake    null

Что я делаю не так? Кажется, что-то маленькое, чего мне не хватает, я не вижу себя. даже если я изменю статистическую функцию с SUM на COUNT, для значений столбца @Year вместо 0 будет ноль

1 Ответ

2 голосов
/ 30 ноября 2011

Вы близки, но чтобы это работало, вы должны сконструировать ваш PIVOT, используя динамический SQL, а затем выполнить его. Итак, после того, как вы заполнили свою переменную @Year, вам нужно сделать что-то вроде этого:

DECLARE @Query VARCHAR(MAX)

SET @Query = '
SELECT * from ( SELECT Amount, FYYear, column1, column2,column3 from BUYSCTE ) BUY 
PIVOT( SUM(Amount) FOR FYYear in ('+ @Year + ') ) pvt'

EXEC(@Query)

Хотя, прежде чем сделать это, вы должны взглянуть на эту ссылку .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...