2013-09-20 4 views
0

У меня проблема и не могу ее решить. Кроме того, я не могу найти ответ в любом месте в Интернете.TSQL: как добавить автоматически выбрать столбцы

Упрощенные У меня есть большой стол с coloumns, где значения для продуктов с идентификатором хранящимися в году:

  • года
  • ID
  • значение

В моей хранимой процедуре атрибутами для получения информации являются:

  • @Year
  • @Id

Если вы хотите получить информацию о более чем одном продукте, вы можете использовать запятые отделено список продуктов идентификаторов типа («654654,543543,987987»).

Моего TSQL должен быть такой:

select year, 
    sum(case when id = @id[1] then value), 
    sum(case when id = @id[2] then value), 
    [...] 
from table myTable 
where year = @year 
group by year 
order by year 

То, что я хочу сделать, это итерация Повсеместно запятая-отделенны идентификаторы и для каждого идентификатора, я хочу, чтобы добавить новый выберите attribut, как это (сумма (случай когда идентификатор = @id [х], то значение).

Можете ли вы помочь мне с этим проблемы? Любые предложения, чтобы решить это ?!

Спасибо за вашу помощь!

+3

Рассмотрим, используя табличное значение параметра вместо запятой списке. Кроме того, вы должны стремиться вернуть результаты в другом формате (результаты PIVOT не хороши в динамике, они также нуждаются в фиксированном числе столбцов!). Оставьте бит pivot-y в своем интерфейсе. – gvee

ответ

1

PIVOT Операция может упростить запрос.

Но, в любом случае, кажется, что единственный способ построить такой запрос - использовать динамический SQL.

DECLARE 
    @Ids NVARCHAR(MAX), 
    @stmt NVARCHAR(MAX) 

SET @Ids = '1,2' 

-- Transform Ids into the format PIVOT understands - with square brackets. 
-- Primitive way, to not overcomplicate sample. 
SET @Ids = '[' + REPLACE(@Ids, ',', '], [') + ']' 
PRINT @Ids -- [1], [2] 

SET @Stmt = ' 
    SELECT * 
    FROM Products as p 
    PIVOT 
    (
     SUM(p.Value) 
     FOR p.Id IN (' + @Ids + ') 
) AS t 
    ORDER BY Year' 


EXEC sp_executesql @Stmt 

Если вам нужен более точный способ разделения разделенный запятыми список в массив (таблица), пожалуйста, см это article для деталей.

В этом примере доступно на SQL Fiddle

0

Как вы используете хранятся пр ocedure, вы можете использовать sp_executesql для выполнения инструкции SQL с динамическим построением.

Таким образом, вы должны перебрать CSV, как это:

DECLARE @List NVARCHAR(MAX) = N'1001,dada,1002,1003' 
DECLARE @ProductsID TABLE ([ID] BIGINT) 


DECLARE @XML xml = N'<r><![CDATA[' + REPLACE(@List, ',', ']]></r><r><![CDATA[') + ']]></r>' 

INSERT INTO @ProductsID ([ID]) 
SELECT DISTINCT CAST(Tbl.Col.value('.', 'float') AS bigint) 
FROM @xml.nodes('//r') Tbl(Col) 
WHERE ISNUMERIC(Tbl.Col.value('.', 'varchar(max)')) = 1 

SELECT [ID] FROM @ProductsID 

Затем, имея таблицу с идентификатором для динамического построения вам SQL заявление и выполнить его.

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