Разбор строковых данных хранится в одном столбце, а затем разворачивается в отдельные столбцы. - PullRequest
1 голос
/ 05 октября 2019

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

Мне кажется, что мне нужно изменить инструкцию раздела и включить случай, когда, а затем изменить '|'1, 2, 3 и т. д.

Первоначальный охват работника общественного здравоохранения XYZ - женщина 48 лет, с которой связались 99/99/19. Причина охвата: Этот автор звонил из-за XYZ Источник направления: CCM NCM Первоначальный контакт / статус: Согласился на регистрацию Было ли 7-дневное последующее наблюдение с запланированным PCP: НЕТ Вам нужна помощь с доставкой в ​​офис PCP: Нет Выявленные проблемы или проблемы:

WITH C AS(

SELECT DISTINCT hnt.note_id, hnt.line,  replace(replace(replace(replace(replace(replace(replace(replace
(note_text, 'CHW Initial Contact/Status:', 'Initial Status'),'Community Health Worker Initial Outreach', '|'), 'Reason for Outreach:', '|')
, 'Referral Source:', '|'), 'Initial Contact/Status:', '|'), 'Was 7 day follow-up with PCP scheduled:','|'),'Do you need assistance with transportation to the PCP office:','|'),
'Identified Issues or Concerns:','|') as field  , row_number () over (partition by hnt.note_id order by hnt.contact_date desc) rn        
From hno_note_text hnt
inner join       note_smartphrase_ids    nsi on hnt.NOTE_CSN_ID = nsi.NOTE_CSN_ID

CROSS APPLY string_split(replace(replace(replace(replace(replace(replace(replace(replace
(note_text, 'CHW Initial Contact/Status:', 'Initial Status'),'Community Health Worker Initial Outreach', '|'), 'Reason for Outreach:', '|')
, 'Referral Source:', '|'), 'Initial Contact/Status:', '|'), 'Was 7 day follow-up with PCP scheduled:','|'),'Do you need assistance with transportation to the PCP office:','|'),
'Identified Issues or Concerns:','|') , '|')    as separated
where smartphrases_id = '151325'    and hnt.line = '1' 
)
SELECT  note_id,
 [1] AS Initial_Outreach
      ,[2] AS Reason
      ,[3] AS RefSource
      ,[4] AS Contact_Status
      ,[5] AS SevenDay
      ,[6] AS Transportation
      ,[7] AS Issues
FROM C
PIVOT(
    MAX(field)
    FOR RN IN([1],[2],[3],[4],[5],[6],[7])  
) as PVT

- На основании предложенных изменений, измененный код для(Понятия не имею, почему последняя часть исправленного кода не отображается!):

DECLARE @mockupTable TABLE(ID varchar(254), YourString VARCHAR(MAX));
INSERT INTO @mockupTable 
select distinct hnt.note_id, note_text
From hno_note_text hnt
inner join note_smartphrase_ids nsi on hnt.NOTE_CSN_ID = nsi.NOTE_CSN_ID
where smartphrases_id = '151325'    and hnt.line = '1' 

SELECT  *
FROM @mockupTable t

CROSS APPLY(SELECT CONCAT('{'
,REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(t.YourString
,'Community Health Worker Initial Outreach','"Initial_Outreach":"')
,'Reason for Outreach:','","Reason":"')
,'Referral Source:','","RefSource":"')
,'Was 7 day follow-up with PCP scheduled:','","SevenDay":"')
,'Do you need assistance with transportation to the PCP                     office:','","Transportation":"')
,' Identified Issues or Concerns:','","Issues":"'), 'ACO PRAPARE Screening  Questionnaire','","PRAPARE":"'),
'Next Steps:','","Next Step":"')
,'"}')) A(CastedToJSON)
CROSS APPLY OPENJSON(A.CastedToJSON)
WITH(Initial_Outreach VARCHAR(MAX)
,Reason VARCHAR(MAX)
,RefSource VARCHAR(MAX)
,SevenDay VARCHAR(MAX)
,Transportation VARCHAR(MAX)
,Issues VARCHAR(MAX)
,Prapare VARCHAR(MAX)
,NextSteps VARCHAR(MAX)
) B;

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Я выбрал немного другой подход:

Объявление таблицы @mocktable (поле varchar (2000)) Вставить в @ mocktable

select distinct replace(replace(replace(replace(replace(replace(replace(replace(replace(replace
(note_text, 'CHW Initial Contact/Status:', 'Initial Status'),'Community Health Worker Initial Outreach', '|'), 'Reason for Outreach:', '|')
, 'Referral Source:', '|'), 'Initial Contact/Status:', '|'), 'Was 7 day follow-up with PCP scheduled:','|'),'Do you need assistance with transportation to the PCP office:','|'),
'Identified Issues or Concerns:','|'), 'ACO PRAPARE Screening Questionnaire','|'),
 'Next Steps:','|') as field 
From hno_note_text hnt
inner join note_smartphrase_ids nsi on hnt.NOTE_CSN_ID = nsi.NOTE_CSN_ID
 where smartphrases_id = '151325'   and hnt.line = '1' 
select a.*, b.* from @mocktable   a

Cross Apply (
Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)')))
,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)')))
From  (Select Cast('<x>' + replace((Select replace(field,'|','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as B1
) B
0 голосов
/ 06 октября 2019

В SQL-Server 2016 (вы прокомментировали SSMS 2016 ) я бы предложил пройтись по маршруту JSON:

DECLARE @mockupTable TABLE(ID INT IDENTITY, YourString NVARCHAR(MAX));
INSERT INTO @mockupTable VALUES(N'Community Health Worker Initial Outreach XYZ is an 48 y.o. female contacted on 99/99/19. Reason for Outreach: This writer called due to XYZ Referral Source: CCM NCM Initial Contact/Status: Agreed to Enrollment Was 7 day follow-up with PCP scheduled: NO Do you need assistance with transportation to the PCP office: No Identified Issues or Concerns:')

SELECT *
FROM @mockupTable t
CROSS APPLY(SELECT CONCAT('{'
                         ,REPLACE(
                          REPLACE(
                          REPLACE(
                          REPLACE(
                          REPLACE(
                          REPLACE(
                          REPLACE(t.YourString
                                 ,'Community Health Worker Initial Outreach','"Initial_Outreach":"')
                                 ,'Reason for Outreach:','","Reason":"')
                                 ,'Referral Source:','","RefSource":"')
                                 ,'Initial Contact/Status:','","Contact_Status":"')
                                 ,'Was 7 day follow-up with PCP scheduled:','","SevenDay":"')
                                 ,'Do you need assistance with transportation to the PCP office:','","Transportation":"')
                                 ,'Identified Issues or Concerns:','","Issues":"')
                         ,'"}')) A(CastedToJSON)
CROSS APPLY OPENJSON(A.CastedToJSON)
            WITH(Initial_Outreach NVARCHAR(MAX)
                ,Reason NVARCHAR(MAX)
                ,RefSource NVARCHAR(MAX)
                ,Contact_Status NVARCHAR(MAX)
                ,SevenDay NVARCHAR(MAX)
                ,Transportation NVARCHAR(MAX)
                ,Issues NVARCHAR(MAX)
                ) B;

Промежуточный JSON выглядит следующим образом:

{
    "Initial_Outreach": " XYZ is an 48 y.o. female contacted on 99/99/19. ",
    "Reason": " This writer called due to XYZ ",
    "RefSource": " CCM NCM ",
    "Contact_Status": " Agreed to Enrollment ",
    "SevenDay": " NO ",
    "Transportation": " No ",
    "Issues": ""
}

Идея вкратце:

  • Мы используем некоторые строковые методы для преобразования вашей строки в строку JSON
  • мы используем OPENJSON, чтобы попасть вJSON и
  • мы используем WITH -класс для возврата результата в столбцах (неявное вращение)

Подсказка: результат может нуждаться в некоторой обрезке ...

...