Нужна помощь в удалении нулевых данных и получении записей за последние месяцы - PullRequest
1 голос
/ 08 мая 2020
SELECT 
    CLIENTS.LAST_NAME, 
    CLIENTS.FIRST_NAME, 
    CLIENTS.DOB, 
    CLIENTS.ALT_ID,
    CLIENT_SCREENING_TOOLS.SCREEN_DATE,
    CASE 
       WHEN CLIENT_SCREENING_TOOLS.TEST_NAME = 'Patient Health Questionnaire (PHQ-9)' 
          THEN 'D - Depression Screen'
       WHEN CLIENT_SCREENING_TOOLS.TEST_NAME = 'Resident CAGE-AID Questionnaire' 
          THEN 'B - Substance Abuse Screen'
       ELSE 'NULL'
    END AS SERVICE
FROM
    CLIENTS
JOIN 
    CLIENT_SCREENING_TOOLS ON CLIENTS.SHISID = CLIENT_SCREENING_TOOLS.SHISID
WHERE  
    CLIENTS.LAST_NAME != 'TEST' 
    AND CLIENT_SCREENING_TOOLS.TEST_NAME != 'NULL'

Мне кажется, что я довольно близок к этому, но мой оператор where работает некорректно. Столбец моей службы все еще заполняет данные NULL. Другая часть, с которой мне нужна помощь, - это сбор данных за последние месяцы. Если вы посмотрите на изображение, дата будет в формате 2020-03-14 17:38:00.

введите здесь описание изображения

Дайте мне знать, есть ли у меня какие-либо советы по форматированию, это ново для меня.

Текущий код:

SELECT CLIENTS.LAST_NAME, 
   CLIENTS.FIRST_NAME, 
   CLIENTS.DOB, 
   CLIENTS.ALT_ID,
   CLIENT_SCREENING_TOOLS.SCREEN_DATE,
   CASE 
        WHEN CLIENT_SCREENING_TOOLS.TEST_NAME = 'Patient Health Questionnaire (PHQ-9)' THEN 'D - Depression Screen'
        WHEN CLIENT_SCREENING_TOOLS.TEST_NAME = 'Resident CAGE-AID Questionnaire' THEN 'B - Substance Abuse Screen'
        ELSE CLIENT_SCREENING_TOOLS.TEST_NAME
    END AS SERVICE
FROM CLIENTS
JOIN CLIENT_SCREENING_TOOLS
ON CLIENTS.SHISID = CLIENT_SCREENING_TOOLS.SHISID
WHERE CLIENTS.LAST_NAME != 'TEST' 
AND CLIENT_SCREENING_TOOLS.TEST_NAME IN
(
'Patient Health Questionnaire (PHQ-9)',
'Resident CAGE-AID Questionnaire'
)
AND SCREEN_DATE 
BETWEEN
 add_months(trunc(sysdate,'mm'),-1) 
AND last_day(add_months(trunc(sysdate,'mm'),-1))

Это код перед последним месяцем: enter image description here

Это после кода:

enter image description here

1 Ответ

1 голос
/ 08 мая 2020

В вашем вопросе несколько требований, позвольте мне рассмотреть их по одному.

CLIENT_SCREENING_TOOLS.TEST_NAME! = 'NULL'

Это неверно, NULL не является строкой для сравнения с использованием оператора !=. Правильный способ - использовать IS NOT NULL:

WHERE CLIENTS.LAST_NAME != 'TEST' 
AND CLIENTS.LAST_NAME IS NOT NULL
AND CLIENT_SCREENING_TOOLS.TEST_NAME IS NOT NULL

формат даты: 2020-03-14 17: 38: 00

DATE doesn ' У меня нет формата. Вы видите то, как оно отображается в соответствии с вашим locale-specific NLS settings.

Вы закодировали выражение CASE так, чтобы оно имело NULL значение в виде строки в части ELSE:

CASE 
   WHEN CLIENT_SCREENING_TOOLS.TEST_NAME = 'Patient Health Questionnaire (PHQ-9)' 
      THEN 'D - Depression Screen'
   WHEN CLIENT_SCREENING_TOOLS.TEST_NAME = 'Resident CAGE-AID Questionnaire' 
      THEN 'B - Substance Abuse Screen'
   ELSE 'NULL' --> This is why you see NULL in your output
END AS SERVICE

Если выражение THEN не выполняется, оно будет отображать 'NULL' в виде строки.

Вместо этого вы можете просто создать условие фильтра как:

AND CLIENT_SCREENING_TOOLS.TEST_NAME IN
( 
  'Patient Health Questionnaire (PHQ-9)' , 
  'Resident CAGE-AID Questionnaire'
)

Другая часть, с которой мне нужна помощь, это получение данных только за последние месяцы

Чтобы получить данные LAST MONTH, вы можете использовать следующее условие:

AND SCREEN_DATE 
BETWEEN
    add_months(trunc(sysdate,'mm'),-1) 
AND last_day(add_months(trunc(sysdate,'mm'),-1))

Например,

alter session set nls_date_format = 'YYYY-MM-DD';
SELECT
    add_months(trunc(sysdate, 'mm'), - 1) "start",
    last_day(add_months(trunc(sysdate, 'mm'), - 1)) "end"
FROM
    dual;

start      end       
---------- ----------
2020-04-01 2020-04-30
...