2015-01-22 4 views
-1
Chromosome Locus  Variant_A Variant_B Variant Strain_ID Family Parent1_Name Parent1_Marker Parent2_Name Parent2_Marker Line Marker Gid 
---------------------------------------------------------------------------------------------------------------------------------------------------------------- 
Gm09  40907915 G   A   GA  DS11.46096 46  IA3023   AA    PI507.681B*  BB    96  BB  2 
Gm09  422384  G   A   GA  DS11.46096 46  IA3023   AA    PI507.681B*  BB    96  AA  4 
Gm09  422720  A   G   AG  DS11.46096 46  IA3023   BB    PI507.681B*  AA    96  BB  5 
Gm09  424439  C   A   CA  DS11.46096 46  IA3023   AA    PI507.681B*  BB    96  AA  7 
Gm09  425375  G   T   GT  DS11.46096 46  IA3023   AA    PI507.681B*  BB    96  AA  9 
Gm09  425581  T   C   TC  DS11.46096 46  IA3023   BB    PI507.681B*  AA    96  BB  10 
Gm09  43921862 C   A   CA  DS11.46096 46  IA3023   BB    PI507.681B*  AA    96  AA  12 

Я прикрепил изображение таблицы. Эта таблица содержит идентификаторы в Strain_ID, и каждый идентификатор имеет несколько маркеров в разных локусах. Я хочу, чтобы pivot на агрегировании Loci на маркере, чтобы я мог иметь отдельные strain_Ids в строках и всех локусах в виде столбцов.Ошибка синтаксиса в динамическом запросе сервера sql с основанием pivot

Это сценарий, я использую на SQL Server 2012 Management студии:

declare @cols varchar(Max) 
declare @cols1 varchar(Max)  

set @cols ='[' ; 

select @cols += 'D.'+QUOTENAME (Locus) + ',' 
from(
    select distinct Locus from genotypeQA where Chromosome IN ('Gm01') 
) as X 

set @cols= stuff(replace(@cols,'D.[','['),1,1,'') 
print @cols 

set @cols1 = SUBSTRING(@cols,1,LEN(@cols)-1) 
print @cols1 

select * 
from (
    select 
    genotypeQA.Strain_ID, 
    genotypeQA.Family, 
    '+ @cols +', 
    genotypeQA.Marker 
from genotypeQA 
where 
    genotypeQA.Family IN ('10') 
    AND genotypeQA.Chromosome IN ('Gm01') 
) as D 

Pivot( 
MAX(Marker) 
For Locus IN ('+ @cols +')) as p 

Я получаю следующее сообщение об ошибке:

Msg 102, Level 15, State 1, Line 31 
Incorrect syntax near '+ @cols +'. 



I expect the following format of output shown here with part of the table: 


| Strain  |   | Gm09_40907915 | Gm09_422384 | Gm09_422720 | Gm09_424439 | | 
| DS11.46096 | Variant_A | G    | G   | A   | C   | | 
| DS11.46096 | Variant_B | A    | A   | G   | A   | | 
| DS11.46096 | Variant | GA   | GA   | AG   |  CA | | 

+ ------------ + ----------- + --------------- + ------------- + ------- ------ + ----------

+0

Стол был загрязнен в посте ... Первые 2 строк являются заголовками столбцов до заголовка Маркера –

+0

@wewesthemenace: Как вы отформатировали таблицу в этом конкретном формате. Я хочу отредактировать ожидаемую таблицу вывода в этом формате. –

ответ

0

EDIT:

Прежде всего, вам нужно принести Variant, Variant_A и Variant_B значения в одном столбце и соответствующие значения имени столбца в другой колонке, то есть, вы должны UNPIVOT. Я использовал CROSS APPLY вместо UNPIVOT здесь.

Объявите переменную, чтобы получить имена столбцов для таблицы повернута

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + ChrLocus + ']', '[' + ChrLocus + ']') 
       FROM  
       (
        SELECT DISTINCT Chromosome+'_'+ CAST(Locus AS VARCHAR(10))ChrLocus 
        FROM #TEMP 
       ) PV 
       ORDER BY ChrLocus 

Теперь откинуть результат. Я написал логику внутри запроса

DECLARE @query NVARCHAR(MAX) 
SET @query = '-- This outer query forms your pivoted result 
      SELECT * FROM 
      (
       -- Source data for pivoting 
       SELECT DISTINCT Chromosome+''_''+ CAST(Locus AS VARCHAR(10))ChrLocus,Strain_ID, 
       Variants,COLNAMES 
       FROM #TEMP 
       CROSS APPLY(VALUES (Variant_A,''Variant_A''),(Variant_B,''Variant_B''),(Variant,''Variant'')) 
       AS COLUMNNAMES(Variants,COLNAMES) 
      ) x 
      PIVOT 
      (
       --Defines the values in each dynamic columns 
       MIN(Variants) 
       -- Get the names from the @cols variable to show as column 
       FOR ChrLocus IN (' + @cols + ') 
      ) p    
      ORDER BY Strain_ID;' 

EXEC SP_EXECUTESQL @query 
  • Click here для просмотра результата
+0

Не стесняйтесь спрашивать о других изменениях @ Vishnu Ramasubramanian –

+0

Спасибо за ваше предложение. Но это все еще не работает ... Любые другие идеи –

+0

Какая ошибка вы получаете? @Vishnu Ramasubramanian –

0

Вы должны поместить SQL в переменную, а затем использовать EXEC (@sqlCode) для выполнения SQL Dynamicically. например. DECLARE @mySql AS VARCHAR(MAX) = sql pivot query here. Затем вызовите EXEC (@sqlCode), чтобы сгенерировать результат. Как это:

DECLARE @sqlCode AS VARCHAR(MAX); 
    SET @sqlCode = 'select * 
    from (
    select genotypeQA.Strain_ID, genotypeQA.Family,'+ @cols + ' ,genotypeQA.Marker from genotypeQA where genotypeQA.Family IN ('10') AND genotypeQA.Chromosome IN ('Gm01') 
    ) as D 
    Pivot(MAX(Marker) For Locus IN ('+ @cols +')) as p' 
EXEC (@sqlCode) 
+0

Даже это не сработает –

+0

Когда вы печатаете @cols, есть ли запятая в начале или конце строки? –

+0

Не из-за этого. Вы не можете использовать '@ cols' в исходном исходном запросе и в том месте, где clause' .IN ('Gm01') .. 'также выйдет –