2016-03-24 26 views
0

根据我原始帖子中两条评论的输入,我做了修改并创建了以下脚本的一个版本。下面的所有内容都称为T13,并与其他表格保持联接。它的工作。也许有一个更有效的方法来做到这一点,但它的工作。然后,我做的唯一事情就是添加“UNION ALL”部分。从那时起,我不断收到以下错误:限于唯一ID a具有多个子句的CASE

错误: ORA-00911:无效字符 00911. 00000 - “无效字符” *原因:标识不得与 字母和数字以外的任何ASCII字符开始。 $#_也是在第一个 之后的字符。由双引号括起来的标识符可能包含 除双引号以外的任何字符。替代引号 (q'#...#')不能使用空格,制表符或回车作为 分隔符。有关所有其他上下文,请参阅SQL语言参考手册 。 *操作: 错误在行:143列:27

我追逐错误,只是重新编写相同的代码,然后再次弹出一个不同的行和列。

-

下面是我正在尝试做的原始文章。

下面的脚本是为了给我一个yesno为每个AN_52_ENC_CSN_ID。问题在于medication_ID可能在我的时间限制之外另外发生。结果是多个AN_52_ENC_CSN_ID其中之一是yes和其余no。如果发生在列出的时间限制内,我怎么能只有一个唯一的AN_52_ENC_CSN_ID,yes,否则no。我想过一种方法来计算包含yes的独特AN_52_ENC_CSN_ID的行,然后在AN_52_ENC_CSN_ID上分组,但我无法将其包围。

有帮助吗?

SELECT T3.AN_52_ENC_CSN_ID, T3.AN_STOP_DATETIME, (T3.AN_STOP_DATETIME +.125), 
CASE 
    WHEN TOTAL_ADMIN_COUNT > 0 THEN 'YES' 
    ELSE 'NO' END AS PONV 
From (SELECT 
    CLARITY.F_AN_RECORD_SUMMARY.AN_52_ENC_CSN_ID, 
    CLARITY.F_AN_RECORD_SUMMARY.AN_STOP_DATETIME, 
    CLARITY.F_AN_RECORD_SUMMARY.AN_EPISODE_ID 
    FROM CLARITY.OR_LOG 
    INNER JOIN CLARITY.F_AN_RECORD_SUMMARY 
    ON CLARITY.OR_LOG.LOG_ID = CLARITY.F_AN_RECORD_SUMMARY.LOG_ID 
    INNER JOIN CLARITY.V_LOG_BASED 
    ON CLARITY.OR_LOG.LOG_ID = CLARITY.V_LOG_BASED.LOG_ID 
    INNER JOIN CLARITY.PATIENT 
    ON CLARITY.F_AN_RECORD_SUMMARY.AN_PAT_ID = CLARITY.PATIENT.PAT_ID 
    WHERE CLARITY.OR_LOG.LOC_ID    IN (4060020, 4060021) 
    and (CLARITY.F_AN_RECORD_SUMMARY.AN_STOP_DATETIME - CLARITY.F_AN_RECORD_SUMMARY.AN_START_DATETIME) *24*60 > 0 
) T10 

LEFT JOIN 
(
SELECT AN_EPISODE_ID, 
     SUM(MedCount) AS TOTAL_ADMIN_COUNT 
FROM (SELECT AN_EPISODE_ID, COUNT(ord.ORDER_MED_ID) as MedCount 
     FROM F_AN_RECORD_SUMMARY An 
     inner join MAR_ADMIN_INFO Mar 
     on An.AN_52_ENC_CSN_ID = Mar.MAR_ENC_CSN 
     inner join ORDER_MED Ord 
     on Mar.ORDER_MED_ID = Ord.ORDER_MED_ID 
     inner join V_LOG_TIMING_EVENTS ORL 
     on An.LOG_ID = ORL.LOG_ID 
     where Ord.MEDICATION_ID IN (104661, 2787) 
     and Mar.TAKEN_TIME > AN.AN_STOP_DATETIME -- ANESTHESIA STOP TIME 
     and Mar.TAKEN_TIME < (AN.AN_STOP_DATETIME +.125) -- ANESTHESIA STOP TIME PLUS 3 HOURS 
     group by An.AN_EPISODE_ID 
     Union all 
     select AN_EPISODE_ID, COUNT(ord2.ORDER_MED_ID) as MedCount 
     from F_AN_RECORD_SUMMARY An2 
     inner join AN_HSB_LINK_INFO Link2 
     on An2.AN_52_ENC_CSN_ID=Link2.AN_52_ENC_CSN_ID 
     inner join MAR_ADMIN_INFO Mar2 
     on Link2.AN_BILLING_CSN_ID = Mar2.MAR_ENC_CSN 
     inner join ORDER_MED Ord2 
     on Mar2.ORDER_MED_ID = Ord2.ORDER_MED_ID 
     inner join V_LOG_TIMING_EVENTS ORL2 
     on An2.LOG_ID = ORL2.LOG_ID 
     where Ord2.MEDICATION_ID IN (104661, 2787) 
     and Mar2.TAKEN_TIME > AN.AN_STOP_DATETIME -- ANESTHESIA STOP TIME 
     and Mar2.TAKEN_TIME < (AN.AN_STOP_DATETIME +.125) -- Stop +3 HOURS 
     Group by An2.AN_EPISODE_ID 
) 
GROUP BY AN_52_ENC_CSN_ID 
)T11 
ON T10. AN_52_ENC_CSN_ID = T11. AN_52_ENC_CSN_ID 

回答

0

使用公共表表达式在同一数据集上尝试LOJ。这不是测试,只是一个想法

WITH temp_calc AS (your query...) 
SELECT   t1.*, 
       CASE WHEN t2.ponv_prophylaxis = 'yes' THEN 'yes' ELSE 'no' 
       END AS new_ponv_prophylaxis 
FROM   temp_calc t1 
LEFT OUTER JOIN temp_calc t2 
ON    t1.an_52_enc_csn_id= t2.an_52_enc_csn_id AND other joins... 
0

您可以使用ROW_NUMBER解析函数制定的第一行,然后设置其他一切'no'

select an_52_enc_csn_id, 
     case when row_number() over (partition by an_52_enc_csn_id order by ponv_prophylaxis desc) = 1 
       then ponv_prophylaxis 
      else 'no' 
     end ponv_prophylaxis 
from (select rsum.an_52_enc_csn_id, 
       case when om.medication_id in (104661, 104662) 
          and mai.taken_time > vlte.patient_in_preprocedure_dttm 
          and mai.taken_time < vlte.patient_out_room_dttm 
         then 'yes' 
        else 'no' 
       end as ponv_prophylaxis 
     from clarity.or_log olg 
       inner join clarity.f_an_record_summary rsum on olg.log_id = rsum.log_id 
       inner join clarity.v_log_based vlg on olg.log_id = vlg.log_id 
       left join clarity.mar_admin_info mai on rsum.an_52_enc_csn_id = mai.mar_enc_csn 
       inner join clarity.order_med om on mai.order_med_id = om.order_med_id 
       inner join clarity.v_log_timing_events vlte on rsum.log_id = vlte.log_id 
     where olg.loc_id in (4060020, 4060021));  

注:你会注意到我已经使用别名来表格了;它使读取和删除SQL语句变得更加容易,从而使它变得更小!

+0

我很欣赏这个输入,但那并不奏效。仍然有重复的52_enc行与是和否。 – JoshuaB

+0

如果您可以更新您的问题以提供您的查询产生的一些样本输出数据以及您想实现的结果,这将有所帮助。那样,我们应该能够更好地帮助你。 – Boneist

相关问题