需要帮助消除Null数据和检索上月记录。

问题描述 投票:0回答:1
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。如果你看图片,日期格式是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

sql oracle oracle12c
1个回答
1
投票

在你的问题中,有多个要求,让我逐一解决。

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 没有任何格式。你看到的是它的显示方式,根据你的 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
© www.soinside.com 2019 - 2024. All rights reserved.