You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个SQL条件生成'Yes'或1结果并实现统计?

SQL条件合并与统计实现方案

问题需求

需要将两个条件合并,当满足任意一个条件时返回'Yes'或1,以便统计符合条件的记录数量。现有条件语句:

AND (ZC_VERB_ORD_MODE_med.VERBAL_MODE_C IN ('118','1','102','101','107')
 OR ZC_VERB_ORD_MODE_proc.VERBAL_MODE_C IN ('118','1','102','101','107')) 

不确定是否需要使用CASE语句,以下是完整查询代码:

@startdate as DATE,
@enddate as DATE;
SET @startdate ='2023-02-01'
SET @enddate = '2023-02-02'
 
 SELECT 
 --CLARITY_LOC.LOC_NAME, 
 --CLARITY_DEP.REV_LOC_ID, 
 --CLARITY_LOC.LOC_ID, 
 --CLARITY_DEP.DEPARTMENT_NAME, 
 --ORDER_METRICS.PAT_LOC_ID, 
 --CLARITY_DEP.DEPARTMENT_ID, 
 --ZC_DEP_SPECIALTY.NAME, 
 --CLARITY_DEP.SPECIALTY_DEP_C, 
 --ZC_DEP_SPECIALTY.DEP_SPECIALTY_C, 
 --ORDER_METRICS.ORDERING_PROV_ID, 
  CLARITY_SER.PROV_NAME, 
  CLARITY_SER.PROV_ID,
 --ZC_NOTE_SER.NAME, 
 --CLARITY_SER.PROVIDER_TYPE_C, 
 --ZC_NOTE_SER.SERVICE_TYPE_C, 
 --ZC_ORDER_TYPE.NAME, 
 --ORDER_METRICS.ORDER_TYPE_C, 
 --ZC_ORDER_TYPE.ORDER_TYPE_C, 
 --ORDER_SIGNED_MED.VERBAL_MODE_C, 
 --ORDER_SIGNED_PROC.VERBAL_MODE_C, 
 ZC_VERB_ORD_MODE_med.NAME as VERBAL_MODE_MED,
 --ZC_VERB_ORD_MODE_med.VERBAL_MODE_C, 
 ZC_VERB_ORD_MODE_proc.NAME as VERBAL_MODE_PROC,
 --ZC_VERB_ORD_MODE_proc.VERBAL_MODE_C, 
 ORDER_METRICS.ORDER_DTTM, 
 --ORDER_SIGNED_MED.LINE, 
 --ORDER_SIGNED_PROC.LINE, 
 --ORDER_SIGNED_PROC.SIGNED_TYPE_C, 
 ORDER_METRICS.ORDER_ID, 
 --ORDER_SIGNED_MED.SIGNED_TYPE_C, 
 ORDER_METRICS.DISPLAY_NAME 
 --ORDER_METRICS.ORDER_DESC
 --ZC_LICENSE_DISPLAY.NAME
 
 FROM ORDER_METRICS ORDER_METRICS 
 LEFT OUTER JOIN ORDER_SIGNED_MED ORDER_SIGNED_MED ON ORDER_METRICS.ORDER_ID=ORDER_SIGNED_MED.ORDER_MED_ID 
 LEFT OUTER JOIN ORDER_SIGNED_PROC ORDER_SIGNED_PROC ON ORDER_METRICS.ORDER_ID=ORDER_SIGNED_PROC.ORDER_PROC_ID
 LEFT OUTER JOIN ZC_ORDER_TYPE ZC_ORDER_TYPE ON ORDER_METRICS.ORDER_TYPE_C=ZC_ORDER_TYPE.ORDER_TYPE_C
 LEFT OUTER JOIN CLARITY_DEP CLARITY_DEP ON ORDER_METRICS.PAT_LOC_ID=CLARITY_DEP.DEPARTMENT_ID
 LEFT OUTER JOIN CLARITY_SER CLARITY_SER ON ORDER_METRICS.ORDERING_PROV_ID=CLARITY_SER.PROV_ID
 LEFT OUTER JOIN ZC_VERB_ORD_MODE ZC_VERB_ORD_MODE_proc ON ORDER_SIGNED_PROC.VERBAL_MODE_C=ZC_VERB_ORD_MODE_proc.VERBAL_MODE_C
 LEFT OUTER JOIN ZC_VERB_ORD_MODE ZC_VERB_ORD_MODE_med ON ORDER_SIGNED_MED.VERBAL_MODE_C=ZC_VERB_ORD_MODE_med.VERBAL_MODE_C 
 LEFT OUTER JOIN CLARITY_LOC CLARITY_LOC ON CLARITY_DEP.REV_LOC_ID=CLARITY_LOC.LOC_ID 
 LEFT OUTER JOIN ZC_DEP_SPECIALTY ZC_DEP_SPECIALTY ON CLARITY_DEP.SPECIALTY_DEP_C=ZC_DEP_SPECIALTY.DEP_SPECIALTY_C
 LEFT OUTER JOIN ZC_NOTE_SER ZC_NOTE_SER ON CLARITY_SER.PROVIDER_TYPE_C=ZC_NOTE_SER.SERVICE_TYPE_C 
 LEFT OUTER JOIN CLARITY_SER_2 CLARITY_SER_2 ON CLARITY_SER.PROV_ID=CLARITY_SER_2.PROV_ID 
 LEFT OUTER JOIN ZC_LICENSE_DISPLAY ZC_LICENSE_DISPLAY ON CLARITY_SER_2.CUR_CRED_C=ZC_LICENSE_DISPLAY.LICENSE_DISPLAY_C
 
 WHERE  ORDER_METRICS.ORDER_DTTM>= @startdate AND ORDER_METRICS.ORDER_DTTM<= @enddate 
 AND ((ORDER_SIGNED_MED.LINE IS  NULL  AND ORDER_SIGNED_PROC.LINE IS  NULL ) 
 OR (ORDER_SIGNED_PROC.LINE IS  NULL  AND ORDER_SIGNED_MED.LINE=1) 
 OR (ORDER_SIGNED_MED.LINE IS  NULL  AND ORDER_SIGNED_PROC.LINE=1))
 AND (ZC_VERB_ORD_MODE_med.VERBAL_MODE_C IN ('118','1','102','101','107')
 OR  ZC_VERB_ORD_MODE_proc.VERBAL_MODE_C IN ('118','1','102','101','107'))
 AND  CLARITY_SER.PROV_ID='1862' 
 --AND CLARITY_SER.PROV_ID='1348'
 --AND (CLARITY_SER.PROV_ID='1184' 
 --OR CLARITY_SER.PROV_ID='1348' 
 --OR CLARITY_SER.PROV_ID='1862' 
 --OR CLARITY_SER.PROV_ID='3432' 
 --OR CLARITY_SER.PROV_ID='3823')

 order by CLARITY_SER.PROV_NAME

解决方案

1. 仅筛选符合条件的记录(当前写法可行)

你当前在WHERE子句中的条件写法是正确的,它会直接过滤出满足任意一个VERBAL_MODE_C条件的记录。如果只是要统计这类记录的数量,直接用COUNT(*)即可,示例:

SELECT COUNT(*) AS 符合条件记录数
FROM ... -- 保留原FROM和WHERE子句内容

2. 在查询结果中标记是否符合条件(需要CASE语句)

如果需要在SELECT结果里显示每条记录是否满足条件,就需要用CASE语句,同时要注意LEFT JOIN可能导致字段为NULL,需排除NULL干扰:

SELECT 
  CLARITY_SER.PROV_NAME, 
  CLARITY_SER.PROV_ID,
  ZC_VERB_ORD_MODE_med.NAME as VERBAL_MODE_MED,
  ZC_VERB_ORD_MODE_proc.NAME as VERBAL_MODE_PROC,
  ORDER_METRICS.ORDER_DTTM,
  ORDER_METRICS.ORDER_ID,
  ORDER_METRICS.DISPLAY_NAME,
  -- 添加标记字段
  CASE 
    WHEN ZC_VERB_ORD_MODE_med.VERBAL_MODE_C IN ('118','1','102','101','107') 
      OR ZC_VERB_ORD_MODE_proc.VERBAL_MODE_C IN ('118','1','102','101','107')
    THEN 'Yes' -- 或写1,根据需求选择
    ELSE 'No' -- 或写0
  END AS 是否符合条件
FROM ... -- 若要保留所有记录,需移除WHERE中的对应条件;若仅保留符合条件的记录,WHERE条件可保留

3. 简化条件写法

可以把重复的IN列表提取出来,让代码更简洁(以MySQL为例):

AND (
  FIND_IN_SET(ZC_VERB_ORD_MODE_med.VERBAL_MODE_C, '118,1,102,101,107')
  OR FIND_IN_SET(ZC_VERB_ORD_MODE_proc.VERBAL_MODE_C, '118,1,102,101,107')
)

注:不同数据库语法有差异,比如PostgreSQL可使用= ANY(ARRAY['118','1','102','101','107'])。


内容的提问来源于stack exchange,提问作者cothmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:17:09