MySQL Дата Между Вопросами Подзапроса - PullRequest
1 голос
/ 21 июля 2010

Хорошо, у меня есть подзапрос, с которым я пытаюсь работать, и мне нужен сложный вопрос. Существует инструмент 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

Этот выше может быть легче читать и легче диагностировать в долгосрочной перспективе.

Спасибо!

1 Ответ

1 голос
/ 21 июля 2010

Ваш (меньший) запрос в его нынешнем виде не имеет ОТ. Если вы введете один из них, у вас будет возможность повесить функцию curdate () из ...

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
    FROM any_table
    LIMIT 1;

Второе предложение ...

SELECT <given date>,
       (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
                  (<given date>                     <= 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
    FROM any_table
    LIMIT 1;

Данная дата может быть литералом или переменной, или она может присутствовать в any_table; он будет отлично работать в подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...