2015-03-19 2 views
0
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 

Это таблица, которую у меня есть. Мне нужен этот вывод:Подзапрос SQL Server с точкой поворота

| 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 | | 

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

Когда я пользуюсь этим код:

use nam13; 

DECLARE @cols NVARCHAR (MAX) 

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

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

DECLARE @query NVARCHAR(MAX) 

SET @query = (SELECT * 
     FROM 
     ( -- Source data for pivoting 
      SELECT Chromosome+'_'+ CAST(Locus AS VARCHAR(10))ChrLocus,Strain_ID, 
      Variants,COLNAMES 
      FROM genotypeQA 
      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    
    ); 

EXEC SP_EXECUTESQL @query 

я получаю следующее сообщение об ошибке в SQL Server:

Msg 116, уровень 16, состояние 1, строка 36
только одно выражение может быть задано в список выбора, когда подзапрос не вводится с EXISTS.

+0

Возможный дубликат [Синтаксическая ошибка в динамическом sql-сервере с предложением pivot] (http://stackoverflow.com/questions/28100672/syntax-error-in-dynamic-sql-server-query-with-pivot-clause) –

+0

@Jpw: Да, я попробовал сценарий. У меня 5305 строк, которые нужно преобразовать в столбцы. Похоже, что максимальные допустимые столбцы - 4096. Поэтому я не получил требуемый результат. Но проблема не связана со сценарием. Я попытался с уменьшенным количеством строк, но он вернул ошибку БД, которую я пытаюсь выяснить. Позволяет вам знать, как это работает. Благодарю. –

ответ

0

Поскольку вы создаете запрос динамически вы хотите использовать @query как строку и ввести @cols в него.

Я хотел бы сделать некоторые незначительные изменения в запросе тоже (чтобы получить вид вариантов правильных) и ниже запрос должен дать вам желаемый результат:

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

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT Strain_ID, COLNAMES as Variants, ' + @cols + ' 
    FROM 
     ( -- Source data for pivoting 
      SELECT CONCAT(Chromosome,''_'',Locus) ChrLocus,Strain_ID, 
      Variants, COLNAMES, sort 
      FROM genotypeQA 
      CROSS APPLY(VALUES (1, Variant_A,''Variant_A''),(2, Variant_B,''Variant_B''),(3, Variant,''Variant'')) 
      AS COLUMNNAMES(Sort, 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, sort 
    ;' 

--print @query 
EXEC SP_EXECUTESQL @query 

Выходной сигнал будет:

Strain_ID Variants Gm09_40907915 Gm09_422384 Gm09_422720 Gm09_424439 Gm09_425375 Gm09_425581 Gm09_43921862 
---------- --------- ------------- ----------- ----------- ----------- ----------- ----------- ------------- 
DS11.46096 Variant_A G    G   A   C   G   T   C 
DS11.46096 Variant_B A    A   G   A   T   C   A 
DS11.46096 Variant GA   GA   AG   CA   GT   TC   CA 
+0

Спасибо. Скрипт отлично работает с менее чем 4096 строк. Есть ли способ увеличить количество столбцов в выходе. –

+0

@ VishnuRamasubramanian В соответствии с этим документом существует жесткий предел 4096 столбцов в заявлении select: https://msdn.microsoft.com/en-us/library/ms143432.aspx, поэтому, я думаю, вам, возможно, придется найти другое решение, если тебе нужно больше. – jpw

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