2016-11-25 4 views
1

У меня есть две таблицы.make select query condition relative

Первая таблица tblCPWgts,

 cp nvarchar(10) 
     cDate date 
     weight float 

Второй стол tblCP

 cp nvarchar(20) 
     code nvarchar(5) 

Я в настоящее время есть запрос, как показано ниже

select * from 
(
    select cp, cDate, weight from tblCPWgts where cDate >= '2014-09-09' 
)source pivot(max(weight) for cp in ([AB], [CD], [EF]) as pvt order by cDate 

это работает отлично. Однако количество cp будет меняться в будущем. Поэтому вместо того, чтобы жестко кодировать их, как описано выше ([AB], [CD], [EF]), я хотел бы использовать таблицу tblCP, где код столбца имеет AB, CD, EF.

Есть ли способ настроить мой запрос выше, чтобы он не нуждался в жестком кодировании cp? Я попробовал ниже, но после написания он понял, что это явно не сработает, но это то, что я пытаюсь сделать.

select * from 
(
    select cp, cDate, weight from tblCPWgts where cDate >= '2014-09-09' 
)source pivot(max(weight) for cp in (select code from tblCP) as pvt order by cDate 
+0

Вам нужно создать динамический запрос и использовать 'exec()' – artm

+0

Я вижу, как это сделать? – mHelpMe

ответ

5

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

declare @codes nvarchar(max) = '' 

select @codes = @codes + '[' + code + '], ' 
from tblCP 

set @codes = SUBSTRING(@codes, 1, LEN(@codes) - 1) 

declare @q nvarchar(max) 

set @q = 'select * from 
(
    select cp, cDate, weight from tblCPWgts where cDate >= ''2014-09-09'' 
)source pivot(max(weight) for cp in (' + @codes + ') as pvt order by cDate' 

exec(@q) 
+0

Я получаю неправильный синтаксис рядом с ключевым словом 'as' – mHelpMe

+0

игнорировать меня, будучи глупым! – mHelpMe

2

попробуйте этот динамический запрос.

  DECLARE @SQL AS VARCHAR(MAX) 
      DECLARE @code AS VARCHAR (MAX) 


      SELECT @code = 
      COALESCE(@code + ', ','')+ QUOTENAME(code) 
      FROM 
      (
       SELECT distinct code from tblCP 

      ) AS B 


      SET @SQL = ' 
      select * from 
      (
       select cp, cDate, weight from tblCPWgts where 
       cDate >= ''2014-09-09'' 
      )source 

      pivot 
      (max(weight) 

      for cp in ( '[email protected]+') 

      as pvt order by cDate' 

      print (@SQL) 

      EXEC (@SQL) 
+0

@mHelpMe это работа для вас. ? –