连接两个不同变量的三个表

问题描述 投票:0回答:1

我想为每个人保留一个唯一的CLIENT_ID记录,但为每个CLIENT_ID拉入第一行(仅一行)数据。对于大多数 CLIENT_ID,大约有 20 行数据,但我想要提取的大多数变量将始终匹配。例如,对于 CLIENT_ID 555,有 20 行数据,但 CLIENT_ID 555 的 20 行中的每一行的 STATE_CODE 都是相同的。(我读过有关 LEFT JOIN 的其他文章,以及为什么很难仅拉入一个数据)记录,但作为一个 SQL 新手,我不知道如何避免这个?)

但是,在某些行中,20 行中每一行的变量都不同。对于这些变量,我只想获得总数。例如,对于 VACCINE_TYPE,我想计算该 CLIENT_ID 的 20 行中有多少行是 VACCINE_TYPE = COVID-19(即,如果 CLIENT_ID 555 的变量名称 VACCINE_TYPE 下的 20 行中有 2 行 = COVID-19,那么我想要标有“新冠肺炎”的栏目写着“2”。

我还需要从“地址”表中提取 STATE_CODE。

选择 cl.CLIENT_ID, cl.FN, cl.FN, cl.BD, cl.BCN, 地址.STATE_CODE,

(从免疫 IM 中选择 COUNT (im.VACCINE_TYPE),其中 im.VACCINE_TYPE = 'COVID-19')作为 COVID 来自客户 cl 左连接 IMMUNE im ON im.CLIENT_ID = cl.CLIENT_ID 左连接 ADDRESS addr ON addr.ADDRESS_ID = cl.ADDRESS_ID WHERE addr.STATE_CODE='05' AND cl.BD 之间 to_date('01/01/2022','MM/DD/YYYY' AND to_date('12/31/2022','MM/DD/YYYY') AND ((cl.FN <> 'BBY' AND cl.FN 不喜欢 '%NB%' AND cl.FN 不喜欢 '%BB %' AND cl.FN 不喜欢 '%BOY%' AND cl.FN 不喜欢“%GIRL%”和 cl.FN 不喜欢“%BABY%”和 cl.FN 不喜欢“%UNKNOWN%”和 cl.FN 不喜欢“%BBA %” 并且 cl.FN 不喜欢“%BG %”并且 cl.FN 不喜欢“%BGA %”并且 cl.FN 不喜欢“%PENDING%”) 并且 cl.BCN 为空) OR (cl.BCN <> '空' AND (cl.FN <> 'BBY' AND cl.FN 不喜欢 '%NB%' AND cl.FN 不喜欢 '%BB %' AND cl.FIRST_NAME 不喜欢 '%BOY%' AND cl.FN 不喜欢“%GIRL%” AND cl.FN 不喜欢“%BABY%” AND cl.FN 不喜欢“%UNKNOWN%” AND cl.FIRST_NAME 不喜欢“%BBA %” AND cl.FN 不喜欢'%BG %' 和 cl.FN 不喜欢 '%BGA %' 和 cl.FNE 不喜欢 '%PENDING%')) 按 cl.FN 订购

sql merge
1个回答
0
投票

您可以使用

ROW_NUMBER()
等窗口函数为每个
CLIENT_ID
选择不同的记录,确保每个客户端仅获得一行数据。要对
VACCINE_TYPE = 'COVID-19'
等特定条件进行计数,请使用条件聚合(SUM 中的 CASE)与
PARTITION BY
结合来获取每个
CLIENT_ID
的计数:

SELECT cl.CLIENT_ID, 
       cl.FN, 
       cl.BD, 
       cl.BCN, 
       addr.STATE_CODE,
       SUM(CASE WHEN im.VACCINE_TYPE = 'COVID-19' THEN 1 ELSE 0 END) OVER (PARTITION BY cl.CLIENT_ID) AS COVID_COUNT
FROM (
    SELECT CLIENT_ID, FN, BD, BCN, ADDRESS_ID,
           ROW_NUMBER() OVER (PARTITION BY CLIENT_ID ORDER BY your_ordering_column) AS rn
    FROM CLIENT
    WHERE BD BETWEEN TO_DATE('01/01/2022', 'MM/DD/YYYY') AND TO_DATE('12/31/2022', 'MM/DD/YYYY')
      AND ((FN <> 'BBY' AND FN NOT LIKE '%NB%' AND FN NOT LIKE '%BB %' AND FN NOT LIKE '%BOY%' 
            AND FN NOT LIKE '%GIRL%' AND FN NOT LIKE '%BABY%' AND FN NOT LIKE '%UNKNOWN%' 
            AND FN NOT LIKE '%BBA %' AND FN NOT LIKE '%BG %' AND FN NOT LIKE '%BGA %' 
            AND FN NOT LIKE '%PENDING%') 
           AND (BCN IS NULL OR BCN <> 'Null'))
) cl
LEFT JOIN IMMUNE im ON im.CLIENT_ID = cl.CLIENT_ID
LEFT JOIN ADDRESS addr ON addr.ADDRESS_ID = cl.ADDRESS_ID
WHERE addr.STATE_CODE = '05'
  AND cl.rn = 1
GROUP BY cl.CLIENT_ID, cl.FN, cl.BD, cl.BCN, addr.STATE_CODE
ORDER BY cl.FN;
© www.soinside.com 2019 - 2024. All rights reserved.