首页 > 解决方案 > 通过联合加入 2 个查询时,如何消除重复数据?

问题描述

我有 2 个查询提取相同的字段,只有 diff 是 where 子句中的子查询返回的内容。

第一个查询基于代码和 insurance_group_name 拉取

SELECT 
  cpt_codes.code,
  ii.insurance_group_name,
  ii.insurance_group_id,
  CAST(AVG(dcc_total_view.allowedAmount) AS decimal(10, 2)) `AVG Allowed by Group Name`,
 CAST(AVG(rc_total_view.runningCollectedReceivedByProvider) AS decimal(10, 2)) `AVG Collected by Group Name`,
 GROUP_CONCAT(DISTINCT file_acceptance) AS `FAN`
FROM ds
  LEFT OUTER JOIN dd
    ON ds.dos_detail_id = dd.id
   LEFT OUTER JOIN ii
    ON ds.ii_id = ii.id
  LEFT OUTER JOIN dcc
    ON ds.id = dcc.dos_id
  LEFT OUTER JOIN cpt_codes
    ON dcc.cpt_id = cpt_codes.id
  LEFT OUTER JOIN bi
    ON ds.billing_id = bi.id
  LEFT OUTER JOIN cs
    ON bi.claim_status = cs.id
  LEFT OUTER JOIN rc_total_view
    ON ds.payment_information_id = rc_total_view.id
  LEFT OUTER JOIN dcc_total_view
    ON ds.id = dcc_total_view.dos_id
WHERE (cpt_codes.code, ii.insurance_group_name) IN (SELECT 
    cpt_codes.code,
    ii.insurance_group_name  
  FROM ds
    LEFT OUTER JOIN dd
      ON ds.dos_detail_id = dd.id
     LEFT OUTER JOIN ii
      ON ds.ii_id = ii.id
    LEFT OUTER JOIN dcc
      ON ds.id = dcc.dos_id
    LEFT OUTER JOIN cpt_codes
      ON dcc.cpt_id = cpt_codes.id
    LEFT OUTER JOIN bi
      ON ds.billing_id = bi.id
    LEFT OUTER JOIN cs
      ON bi.claim_status = cs.id
  WHERE cs.status = 'Pending'
  AND date_of_service BETWEEN '2017/01/01' AND '2018/08/31'
  AND (dcc.rev_code = '0490'
  OR dcc.rev_code = '0360'))
AND date_of_service BETWEEN '2017/01/01' AND '2018/08/31'
AND (dcc.rev_code = '0490'
OR dcc.rev_code = '0360')
AND  dcc_total_view.allowedAmount > 0
GROUP BY code ,insurance_group_name

这将返回这样的一行

代码 保险组名称 保险组 ID 组名允许的 AVG 按组名收集的 AVG 扇子
20553 AE 215825 1440.97 889.48 DELA081518,MOLDGILR919,SHIC060618,MANS072718,DELA053018,DELS072518

第二个基于 insurance_group_id 拉

SELECT 
  cpt_codes.code,
  ii.insurance_group_name,
  ii.insurance_group_id,
  CAST(AVG(dcc_total_view.allowedAmount) AS decimal(10, 2)) `AVG Allowed by Group Name`,
 CAST(AVG(rc_total_view.runningCollectedReceivedByProvider) AS decimal(10, 2)) `AVG Collected by Group Name`,
 GROUP_CONCAT(DISTINCT file_acceptance) AS `FAN`
FROM ds
  LEFT OUTER JOIN dd
    ON ds.dos_detail_id = dd.id
   LEFT OUTER JOIN ii
    ON ds.ii_id = ii.id
  LEFT OUTER JOIN dcc
    ON ds.id = dcc.dos_id
  LEFT OUTER JOIN cpt_codes
    ON dcc.cpt_id = cpt_codes.id
  LEFT OUTER JOIN bi
    ON ds.billing_id = bi.id
  LEFT OUTER JOIN cs
    ON bi.claim_status = cs.id
  LEFT OUTER JOIN rc_total_view
    ON ds.payment_information_id = rc_total_view.id
  LEFT OUTER JOIN dcc_total_view
    ON ds.id = dcc_total_view.dos_id
WHERE (cpt_codes.code, ii.insurance_group_id) IN (SELECT 
    cpt_codes.code,
    ii.insurance_group_id  
  FROM ds
    LEFT OUTER JOIN dd
      ON ds.dos_detail_id = dd.id
     LEFT OUTER JOIN ii
      ON ds.ii_id = ii.id
    LEFT OUTER JOIN dcc
      ON ds.id = dcc.dos_id
    LEFT OUTER JOIN cpt_codes
      ON dcc.cpt_id = cpt_codes.id
    LEFT OUTER JOIN bi
      ON ds.billing_id = bi.id
    LEFT OUTER JOIN cs
      ON bi.claim_status = cs.id
  WHERE cs.status = 'Pending'
  AND date_of_service BETWEEN '2017/01/01' AND '2018/08/31'
  AND (dcc.rev_code = '0490'
  OR dcc.rev_code = '0360'))
AND date_of_service BETWEEN '2017/01/01' AND '2018/08/31'
AND (dcc.rev_code = '0490'
OR dcc.rev_code = '0360')
AND  dcc_total_view.allowedAmount > 0
GROUP BY code ,insurance_group_id

这将返回一行

代码 保险组名称 保险组 ID 组名允许的 AVG 按组名收集的 AVG 扇子
20553 AE 10198703100012 250.25 150.36 MOLDGILR919

当对这两个进行联合时,我发现一些数据重复,其中第二个查询返回的 FAN # 包含在第一个查询的输出中,因为您可以看到 FAN# 是构成第一个脚本结果的部分.
我如何将这两个查询的结果连接在一起,并确保第二个查询中的 FAN# 是否已经包含在第一个给定代码的结果中(例如示例中的 20553),那么第二个查询中的行将不包括在内在最终输出中?
我希望我在这里包含了足够的信息和细节来帮助我,我非常感谢任何帮助解决这个问题。

标签: mysql

解决方案


将您的第一个语句的输出放在一个临时表中,命名为#temp1,并将您的第二个查询的输出放在一个名为 的临时表中#temp2

之后,您可以执行以下操作:

SELECT *
FROM #temp1
UNION ALL
SELECT *
FROM #temp2
WHERE code NOT IN (SELECT code FROM #temp1)

编辑:由于风扇问题..

我认为您应该以这种方式更改查询:不要使用 GROUP_CONCAT(...) 将不同 FAN 的结果组合在一行中,并添加file_acceptance到 GROUP BY 子句

这样,您将获得每个 FAN 的个人记录,并且在UNION ALL您可以再次使用 GROUP_CONCAT() 之后。

由于 AVG() 字段,这可能需要更多的思考/调整工作......


推荐阅读