Как я могу устранить дублирующиеся данные при объединении 2 запросов через объединение?

#mysql

#mysql

Вопрос:

у меня есть 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
 

это вернет строку, подобную этой

код insurance_group_name insurance_group_id Среднее значение, разрешенное именем группы Среднее значение, собранное по имени группы ВЕНТИЛЯТОР
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
 

это вернет строку типа

код insurance_group_name insurance_group_id Среднее значение, разрешенное именем группы Среднее значение, собранное по имени группы ВЕНТИЛЯТОР
20553 AE 10198703100012 250.25 150.36 MOLDGILR919

при объединении этих 2 я обнаруживаю, что некоторые данные дублируются, где FAN #, возвращаемый вторым запросом, включается в выходные данные первого, как вы можете видеть, FAN # является частью тех, которые составляют результаты первого скрипта.
как я могу объединить результаты этих2 запроса и убедитесь, что если FAN # во втором уже включен в результаты первого для данного кода (например, 20553 в примере), то эта строка из второго не будет включена в конечный результат?
Я надеюсь, что я включил достаточно информации и деталей, чтобы помочь мне здесь, я действительно ценю любую помощь, чтобы разобраться в этом.

Комментарии:

1. на самом деле это не так, у вас есть буксировка разных строк, и как должен выглядеть результат

2. это мое замешательство, поскольку идентификатор группы напрямую не связан с именем группы, поэтому я работаю для каждого, я думаю, мне нужно выяснить, как можно сравнить вентиляторы для каждой возвращаемой строки, если возвращено совпадение, тогда не включайте эту строку из запроса group_id, может быть, я могу каким-то образом объединить запросы изатем выберите это с другим предложением where, исключая where FAN from # включено в FAN from First для данного кода? просто не уверен, как это будет работать

3. определите для каждого столбца, какое значение вы хотите получить из первой или второй трети, затем сгруппируйте по коду, или почему бы не сохранить все и не удерживать гм в одной строке.

Ответ №1:

Поместите выходные данные ваших первых статусов во временную таблицу, давайте назовем это #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-предложение

Таким образом, вы получите отдельные записи для каждого вентилятора, annd, после UNION ALL того, как вы можете GROUP_CONCAT() затем снова.

Возможно, потребуется еще немного подумать / настроить работу из-за полей AVG()….

Комментарии:

1. возможно, это так, я попробую, спасибо

2. хорошо, я смог настроить 2 временные таблицы по одной для каждого запроса и запустить объединение all, которое затем дает мне все результаты 2. используя 2 строки вывода из оригинала в качестве примера, я хочу удалить строки, где, если код # совпадает, и имя группы совпадает, как указано вышегде код равен 20553, а имя группы — AE, но #-ы одного из второго запроса уже включены в выходные данные первого запроса как нам удалить эту строку?

3. Добавлен комментарий из-за этой проблемы с вентилятором.