#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. Добавлен комментарий из-за этой проблемы с вентилятором.