Хорошо, у меня есть подзапрос, с которым я пытаюсь работать, и мне нужен сложный вопрос. Существует инструмент SQL, который используется для генерации отчетов. С помощью этого инструмента вы можете выбирать даты, если дата находится во внешнем операторе выбора. Таким образом, вы можете использовать этот инструмент для выбора диапазона дат, например, из простого оператора select, подобного следующему:
select date_entered, name from opportunities
Это будет нормально работать с инструментом.
Однако у меня есть требование SQL, в котором каждый столбец должен содержать собственный оператор SQL (в основном, последовательность подзапросов). Мой вопрос - есть ли в любом случае подзапрос, использующий дату из первоначального выбора? Вот пример оператора select, который мне нужно сделать:
SELECT
(
SELECT
count(
opportunities.id) AS "count_for_opp_id"
FROM
opportunities
LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c
WHERE
opportunities.deleted = '0'
AND ((curdate() - interval 0 day) <= opportunities.date_entered)
AND opportunities_cstm.lead_category_c = 'GM Internet'
AND opportunities_cstm.lead_type_c = 'Sales'
AND opportunities_cstm.partner_id_c LIKE '41%'
OR opportunities_cstm.partner_id_c LIKE '42%'
OR opportunities_cstm.partner_id_c LIKE '43%'
OR opportunities_cstm.partner_id_c LIKE '44%'
OR opportunities_cstm.partner_id_c LIKE '45%'
OR opportunities_cstm.partner_id_c LIKE '47%'
OR opportunities_cstm.partner_id_c LIKE '48%'
OR opportunities_cstm.partner_id_c LIKE '49%'
OR opportunities_cstm.lead_sub_type_c = 'GM 3rd Party'
)AS TOT_DIV_THIRD_PARTY_SALES_LEADS,
(
SELECT
count(opportunities.id) AS "count_for_opp_id"
FROM
opportunities left
JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c
WHERE
opportunities.deleted = '0'
AND ((curdate() - interval 0 day) <= opportunities.date_entered)
AND opportunities_cstm.lead_category_c = 'Dealer Web'
AND opportunities_cstm.lead_type_c = 'Sales'
AND opportunities_cstm.lead_sub_type_c = 'GM Dealer Website'
OR opportunities_cstm.lead_sub_type_c = 'DMA Landing Page'
)AS TOT_DEALER_WEBSITE_DMA_SALES_LEADS,
(
SELECT
count(opportunities.id) AS "count_for_opp_id"
FROM
opportunities left
JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c
JOIN leads_handling_objectives
WHERE
opportunities.deleted = '0'
AND ((curdate() - interval 0 day) <= opportunities.date_entered)
AND opportunities_cstm.lead_category_c = 'GM Internet'
AND opportunities_cstm.partner_id_c LIKE '41%'
OR opportunities_cstm.partner_id_c LIKE '42%'
OR opportunities_cstm.partner_id_c LIKE '43%'
OR opportunities_cstm.partner_id_c LIKE '44%'
OR opportunities_cstm.partner_id_c LIKE '45%'
OR opportunities_cstm.partner_id_c LIKE '47%'
OR opportunities_cstm.partner_id_c LIKE '48%'
OR opportunities_cstm.partner_id_c LIKE '49%'
OR opportunities_cstm.lead_sub_type_c = 'GM 3rd Party'
AND opportunities_cstm.time_followup_c <= leads_handling_objectives.resp_time_obj
AND opportunities_cstm.make_c = leads_handling_objectives.makes_carried
AND opportunities_cstm.time_followup_c IS NOT NULL
)AS NUM_OF_LEADS_RESP_ONTIME_DIVISIONAL_THIRD_PARTY,
(
SELECT
count(opportunities.id) AS "count_for_opp_id"
FROM
opportunities left
JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c
JOIN leads_handling_objectives
WHERE
opportunities.deleted = '0'
AND ((curdate() - interval 0 day) <= opportunities.date_entered)
AND opportunities_cstm.lead_category_c = 'Dealer Web'
AND opportunities_cstm.lead_sub_type_c = 'GM Dealer Website'
OR opportunities_cstm.lead_sub_type_c = 'DMA Landing Page'
AND opportunities_cstm.time_followup_c <= leads_handling_objectives.resp_time_obj
AND opportunities_cstm.make_c = leads_handling_objectives.makes_carried
AND opportunities_cstm.time_followup_c IS NOT NULL
)AS NUM_OF_LEADS_RESP_ONTIME_DEALERWEBSITE_DMA
Если вы посмотрите на этот запрос, вы заметите curdate ... <= date_entered часть подзапроса. Мне нужно, чтобы это было как-то на внешнем слое оператора select. Однако, если я добавлю это на внешний слой, я не уверен, как заставить подзапрос использовать диапазон дат таким образом. </p>
Я знаю, что это сложный вопрос, но - будет ли вообще какой-либо совет от кого-либо там? Спасибо!
(примечание. Кроме того, это не может быть процедура или функция. Это должно быть оператор выбора или представление для работы с инструментом отчетности.)
Еще одно редактирование - здесь можно сосредоточиться на более простом (меньшем) фрагменте приведенного выше SQL:
SELECT
(SELECT
count(
opportunities.id) AS "count_for_opp_id"
FROM
opportunities
LEFT JOIN opportunities_cstm ON opportunities.id = opportunities_cstm.id_c
WHERE
opportunities.deleted = '0'
AND ((curdate() - interval 0 day) <= opportunities.date_entered)
AND opportunities_cstm.lead_category_c = 'GM Internet'
AND opportunities_cstm.lead_type_c = 'Sales'
) AS TOT_DIV_THIRD_PARTY_SALES_LEADS
Этот выше может быть легче читать и легче диагностировать в долгосрочной перспективе.
Спасибо!