Структуры подзапросов SQL - PullRequest
       15

Структуры подзапросов SQL

0 голосов
/ 13 декабря 2018

Впервые в SQL, и я использую со структурами запросов.

Давайте попробуем спросить это снова.

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

FIN   Level1 Level2 Level 3             FCT_MAX   FCT_MAX_Charges    CPT CPT_Charges  DELTA 
1     1        0       1                9284       200                9283    100        100
2     0        1       1                9284       200                9281     50         150     

Первый код (назовите его кодом X) создает следующую таблицу.Цель этого кода - объединить записи с одним и тем же FIN в одну строку и создать переменную DELTA и переменную CHARGES.

USE EMTCQIData

SELECT FIN, Clinical, FCT_MAX, FCT_MAX_CHARGES, CPT, CPT_CHARGES, 
(FCT_MAX_CHARGES - CPT_CHARGES) AS DELTA

FROM
(
SELECT CONC.[Financial Number] as FIN, CONC.Clinical, 

   CASE
          WHEN CONC.Clinical like '%level 5%' THEN '99285' 

   END FCT_MAX,

   CASE
          WHEN CONC.Clinical like '%level 5%' THEN CAST($3768 AS int) 
   END FCT_MAX_CHARGES,

   CPT.CPT,

   CASE
          WHEN CPT.CPT like '99285' THEN CAST($3768 AS int) 
   END CPT_CHARGES
   FROM CPT_MASTER as CPT

 INNER JOIN 

(
SELECT DISTINCT ST2.[Financial Number], 
SUBSTRING(
    (
        SELECT ','+ST1.[Clinical Event Result]  AS [text()]
        FROM ED_FCT_Q1_FY19 ST1
        WHERE ST1.[Financial Number] = ST2.[Financial Number] AND ST1.[Clinical Event Result]<> 'No'
              Order BY [Financial Number] 
        FOR XML PATH ('')
    ), 2, 1000) [Clinical]
FROM ED_FCT_Q1_FY19 ST2
)
as CONC ON CONC.[Financial Number]=CPT.FIN
WHERE CPT.CPT LIKE '9928%'
)
AS COMPLETE

ORDER BY FIN

ТАБЛИЦА ИЗ КОДА X

FIN   Clinical                              FCT_MAX    FCT_MAX_Charges    CPT   CPT_Charges    DELTA 
1     Discharge[Level1] Transfer[Leve3]         9284       200           9283     100          100

Единственное изменение из этой таблицы, которое я хочу, - это разбирать столбец Клинические данные по уровням.Так, например, любое клиническое событие уровня 1 будет иметь свой собственный столбец, аналогично для уровня 2, уровня 3 вплоть до событий уровня 5.

Чтобы разобрать события, я разработал другой код (CODE Z), см. Ниже, этот код анализирует КЛИНИЧЕСКУЮ КОЛОНКУ СОБЫТИЙ;однако он не объединяет столбцы, ниже приведен пример вывода:

FIN          Level1     Level 2     Level3   ...                                      
1            1            0            1
1            0            0            1
2            1            1            1
3            0            0            1
3            1            1            1

КОД Z

SELECT [Financial Number], [Clinical Event Result],

CASE
   WHEN [Clinical Event Result] like '%1:1 Nursing care%' Then '1'
      ELSE '0'
End [1:1 Nursing Care]
...

FROM ED_FCT_Q1_FY19

МОИ ИСТОЧНИКИ ДАННЫХ: ED_FCT_Q1_FY19 имеет следующие столбцы - Финансовый номер, Результат клинического события, Код оплаты Эти данные содержат один и тот же финансовый номер в нескольких строках

CPT_MASTER- FIN, CPT. Эти данные содержат один и тот же FIN в нескольких строках

. Как указано выше, в конечной требуемой таблице будет содержаться уникальный FIN/ Только финансовый идентификатор.FIN может быть связан с финансовым идентификатором.

1 Ответ

0 голосов
/ 13 декабря 2018

Если я понимаю, что вы спрашиваете ... вы можете поместить запрос B во временную таблицу и присоединить его к запросу A, который ограничит результаты, при условии, что есть общий ключ, который разрешит объединение.

SELECT FIN, Clinical, FCT_MAX, FCT_MAX_CHARGES, CPT, CPT_CHARGES, 
(FCT_MAX_CHARGES - CPT_CHARGES) AS DELTA
into #QueryB
FROM
(
SELECT CONC.[Financial Number] as FIN, CONC.Clinical, 

   CASE
          WHEN CONC.Clinical like '%level 5%' THEN '99285' 
   END FCT_MAX,

   CASE
          WHEN CONC.Clinical like '%level 5%' THEN CAST($3768 AS int) 
   END FCT_MAX_CHARGES,

   CPT.CPT,

   CASE
          WHEN CPT.CPT like '99285' THEN CAST($3768 AS int) 
   ND CPT_CHARGES


 FROM CPT_MASTER as CPT

INNER JOIN 

(
SELECT DISTINCT ST2.[Financial Number], 
SUBSTRING(
    (
        SELECT ','+ST1.[Clinical Event Result]  AS [text()]
        FROM ED_FCT_Q1_FY19 ST1
        WHERE ST1.[Financial Number] = ST2.[Financial Number] AND ST1. 
[Clinical Event Result]<> 'No'--removing No's from Clinical that appeared in 
the begining of the rows
              Order BY [Financial Number] 
        FOR XML PATH ('')
    ), 2, 1000) [Clinical]
FROM ED_FCT_Q1_FY19 ST2
)
as CONC ON CONC.[Financial Number]=CPT.FIN
WHERE CPT.CPT LIKE '9928%'
)
as complete 

Затем присоедините его к запросу A, чтобы ограничить результаты A теми, что в B

SELECT [Financial Number], [Clinical Event Result],

CASE
   WHEN [Clinical Event Result] like '%1:1 Nursing care%' Then '1'
      ELSE '0'
End [1:1 Nursing Care],
....
FROM ED_FCT_Q1_FY19 a
join #QueryB b on a.[some criteria] = b.[some criteria]

Фактически вы можете создать временные таблицы для всех этих вложенных запросов, а затемприсоединяйтесь к ним, как это делается в Query B. Я обнаружил, что временные таблицы намного быстрее извлекаются из больших наборов данных несколько раз, как вы, потому что он захватывает данные и сохраняет их, а не запускает вложенный выбор каждый раз.

...