#realJSOP Ответов: 1

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

Последовательность действий? Порядок не важен (из того, что я вижу в Примере результата, который мне предоставили).

1 Ответов

Рейтинг:
7

Richard Deeming

Предполагая, что вы хотите DX значения в порядке возрастания, что-то вроде этого должно работать:

WITH cte As
(
    SELECT
        MRN,
        DX,
        ROW_NUMBER() OVER (PARTITION BY MRN ORDER BY DX) As RN
     FROM
        [mydb].[dbo].[mytable]
)
SELECT
    MRN,
    Max(CASE RN WHEN 1 THEN DX END) As DX1,
    Max(CASE RN WHEN 2 THEN DX END) As DX2,
    Max(CASE RN WHEN 3 THEN DX END) As DX3,
    Max(CASE RN WHEN 4 THEN DX END) As DX4,
    Max(CASE RN WHEN 5 THEN DX END) As DX5,
    Max(CASE RN WHEN 6 THEN DX END) As DX6,
    Max(CASE RN WHEN 7 THEN DX END) As DX7,
    Max(CASE RN WHEN 8 THEN DX END) As DX8,
    Max(CASE RN WHEN 9 THEN DX END) As DX9,
    Max(CASE RN WHEN 10 THEN DX END) As DX10,
    Max(CASE RN WHEN 11 THEN DX END) As DX11,
    Max(CASE RN WHEN 12 THEN DX END) As DX12,
    Max(CASE RN WHEN 13 THEN DX END) As DX13,
    Max(CASE RN WHEN 14 THEN DX END) As DX14,
    Max(CASE RN WHEN 15 THEN DX END) As DX15,
    Max(CASE RN WHEN 16 THEN DX END) As DX16,
    Max(CASE RN WHEN 17 THEN DX END) As DX17,
    Max(CASE RN WHEN 18 THEN DX END) As DX18,
    Max(CASE RN WHEN 19 THEN DX END) As DX19,
    Max(CASE RN WHEN 20 THEN DX END) As DX20
FROM 
    cte
GROUP BY
    MRN
;

Учитывая ваши примерные данные, это приведет к:
MRN | DX1   | DX2   | DX3   | DX4   | ...
-----------------------------------------
123 | a105  | b27   | NULL  | NULL  | ...
124 | 1566A | a106  | b27   | NULL  | ...


#realJSOP

Ты же папаша! Большое спасибо!

Maciej Los

5ed!