2011-12-23 2 views
0

Я пишу запрос SQL с помощью шарнира, и я получаю следующие ошибки:что не так с этим SQL запросом с помощью шарнира

Msg 156, Level 15, State 1, Line 14 
Incorrect syntax near the keyword 'select'. 
Msg 102, Level 15, State 1, Line 14 
Incorrect syntax near ')'. 

и запрос я написал:

select * 
from (
     select a.ID as id, 
      a.dataValue as value 
     from dbo.TableA a (nolock) 
     where a.ID in (select b.ID from dbo.TableB b(nolock)) 
      and a.someOtherId = '4000' 
      and a.DT = '2/16/2011 12:00:00' 
    )as data 
    pivot 
    (
     sum([value]) 
     for [id] in (select ID from dbo.TableB (nolock)) 
    ) as pvt 

Может кто-нибудь помогите мне на этом? Заранее спасибо.

ответ

1

В соответствии с документами Microsoft вы не можете использовать select после in: вы должны указать значения вручную.

[<column that contains the values that will become column headers>] 
    IN ([first pivoted column], [second pivoted column], 
    ... [last pivoted column]) 
) AS <alias for the pivot table> 

Предполагая, что select b.ID from dbo.TableB b(nolock) возвращает 1, 2, 3, вы можете переписать код так:

select * 
from (
    select a.ID as id, 
     a.dataValue as value 
    from dbo.TableA a (nolock) 
    where a.ID in (1,2,3) 
     and a.someOtherId = '4000' 
     and a.DT = '2/16/2011 12:00:00' 
)as data 
pivot 
(
    sum([value]) 
    for [id] in ([1],[2],[3]) 
) as pvt 
+0

@dashblinkenlight: спасибо за ответ. Я тоже думал. Но юср хочет подтвердить. Я делаю это, потому что в tableB есть 100 элементов, и запись 100 столбцов немного утомительна. Можете ли вы что-то предложить? – Ankur

+0

@Ankur Если использование динамического SQL в хранимой процедуре выглядит особенно привлекательно для вас (что я сомневаюсь), вы можете немного исправить эту проблему: SQL-сервер не «понимает» какой-либо другой синтаксис. – dasblinkenlight

0

Вы не можете динамически создавать список полей в течение в п.

for [id] in (select ID from dbo.TableB (nolock)) 

Это недопустимо. Вы должны явно указать имена столбцов (Sorry)

Изменить: выберите ID из dbo.TableB To: (поле1, поле2, поле3) - фактические имена полей, которые вы хотите, чтобы вернуть

Example:

-- Pivot table with one row and five columns 
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4] 
FROM 
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable 
PIVOT 
(
AVG(StandardCost) 
FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) 
) AS PivotTable; 
Смежные вопросы