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.
Возможный дубликат [Синтаксическая ошибка в динамическом sql-сервере с предложением pivot] (http://stackoverflow.com/questions/28100672/syntax-error-in-dynamic-sql-server-query-with-pivot-clause) –
@Jpw: Да, я попробовал сценарий. У меня 5305 строк, которые нужно преобразовать в столбцы. Похоже, что максимальные допустимые столбцы - 4096. Поэтому я не получил требуемый результат. Но проблема не связана со сценарием. Я попытался с уменьшенным количеством строк, но он вернул ошибку БД, которую я пытаюсь выяснить. Позволяет вам знать, как это работает. Благодарю. –