Sql sererver (2008R2) сводный вопрос
У меня есть стол, который я пытаюсь повернуть. Интересующие нас колонки таковы
MRN (nvarchar, представляющий собой числовую последовательность)
DX (nvarchar, представляющий собой код)
Я хочу повернуть данные так, чтобы у меня был один mrn и все коды dx для этого mrn (на каждый mrn может быть до 20 кодов dx).
Моя проблема заключается в том, что мой результирующий набор возвращает все нулевые значения для кодов dx (понятно, что если в исходных данных существует MRN, то с ним связан 1 или более кодов dx).
Что я упускаю?
Что я уже пробовал:
;with cte as ( SELECT [MRN] as MRNPivot ,MRN ,[DX] FROM [mydb].[dbo].[mytable] ) SELECT * FROM cte PIVOT ( min(mrnpivot) for [dx] in (dx1, dx2, dx3, dx4, dx5, dx6, dx7, dx8, dx9, dx10, dx11, dx12, dx13, dx14, dx15, dx16, dx17, dx18, dx19, dx20) ) AS p
Мой результирующий набор выглядит следующим образом:
MRN dx1 dx2 dx3.... dx20 123 NULL NULL NULL... NULL 124 NULL NULL NULL... NULL ... ...
Данные выглядят следующим образом:
mrnpivot mrn dx 123 123 a105 123 123 b27 124 124 b27 124 124 1566A 124 124 a106
Я хочу, чтобы это выглядело так:
mrn dx1 dx2 dx3 dx4... dx20 123 a105 b27 NULL NULL... NULL 124 b27 1566A a106 NULL... NULL
Может быть, стержень - это не то, что мне нужно?
Maciej Los
Странный...
Я проверил это:
;WITH CTE AS ( SELECT '01234' AS mrn, 'dx1' AS dx UNION ALL SELECT '01234', 'dx3' UNION ALL SELECT '21234', 'dx1' UNION ALL SELECT '21234', 'dx2' UNION ALL SELECT '21234', 'dx3' UNION ALL SELECT '88234', 'dx2' ) SELECT * FROM ( SELECT mrn, mrn AS mrnpivot, dx FROM CTE ) AS Src PIVOT(MIN(mrnpivot) FOR dx IN (dx1, dx2, dx3)) AS pvt
и это работает, как и ожидалось.
Maciej Los
Кстати: вы пробовали посмотреть, что возвращает CTE?
#realJSOP
Я обновил свой вопрос (cte возвращает три столбца, указанные из набора данных, со многими другими столбцами (которые не применимы к тому, что я пытаюсь сделать).
Richard Deeming
Как выглядят исходные данные?
Упрощенный тест дает ожидаемый результат:
DECLARE @T TABLE (MRN varchar(10), DX varchar(10)); INSERT INTO @T (MRN, DX) VALUES ('123', 'dx1'), ('123', 'dx2'), ('124', 'dx3'), ('124', 'dx4'), ('124', 'dx1') ; WITH cte As ( SELECT MRN As MRNPivot, MRN, DX FROM @T ) SELECT * FROM cte As F PIVOT ( Min(MRNPivot) FOR DX In (dx1, dx2, dx3, dx4) ) As p ;Выход:
MRN | dx1 | dx2 | dx3 | dx4 ------------------------------- 123 | 123 | 123 | NULL | NULL 124 | 124 | NULL | 124 | 124
#realJSOP
Я уточнил свой вопрос.
Richard Deeming
Да, я не думаю, что ... PIVOT
это то, чего ты хочешь. :)
Какова последовательность ввода значений в столбцы "dx"?
#realJSOP
Последовательность действий? Порядок не важен (из того, что я вижу в Примере результата, который мне предоставили).