сравнение полей двух подзапросов

288
08 августа 2017, 15:03

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

SELECT
    sp_utm_source,
    (
        SELECT
            count(*)
        FROM
            `vtiger_salesorder`
        INNER JOIN vtiger_crmentity ON vtiger_salesorder.salesorderid = vtiger_crmentity.crmid
        WHERE
            createdtime >= CURDATE()
        AND sp_utm_source = 'test'
    ) / (
        SELECT
            count(*)
        FROM
            `vtiger_salesorder`
        INNER JOIN vtiger_crmentity ON vtiger_salesorder.salesorderid = vtiger_crmentity.crmid
        WHERE
            createdtime >= (CURDATE() - INTERVAL 1 DAY)
        AND createdtime <= concat(
            CURDATE() - INTERVAL 1 DAY,
            ' ',
            CURTIME()
        )
        AND sp_utm_source = 'test'
    ) AS rate
FROM
    vtiger_salesorder
INNER JOIN vtiger_crmentity ON vtiger_salesorder.salesorderid = vtiger_crmentity.crmid
AND createdtime BETWEEN CURDATE() - INTERVAL 1 DAY
AND CURDATE()
AND sp_utm_source = 'test'
GROUP BY
    sp_utm_source

Сейчас sp_utm_source завязано на конкретную службу. Вопрос, возможно ли сделать запрос, в котором выводились бы данные по всем службам, чтобы не городить union?

Answer 1

Добрый день.

Вам нужно убрать лишнее условие и добавить связь подзапросов с основным запросом, с помощью алиасов. Должно получиться что-то такое(ниже). Т.к. я не знаю структуру таблиц мог где-то напутать с алиасами. Но суть, я думаю, будет понятна. Условия оставил ваши.

SELECT vs.sp_utm_source,
    (
        SELECT
            count(*)
        FROM
            vtiger_salesorder vs1
        INNER JOIN vtiger_crmentity vc1 ON vs1.salesorderid = vc1.crmid
        WHERE
            vs1.createdtime >= CURDATE()
        AND vs1.sp_utm_source = vs.sp_utm_source
    ) / (
        SELECT
            count(*)
        FROM
            vtiger_salesorder vs2
        INNER JOIN vtiger_crmentity vc2 ON vs2.salesorderid = vc2.crmid
        WHERE
            vs2.createdtime >= (CURDATE() - INTERVAL 1 DAY)
        AND createdtime <= concat(
            CURDATE() - INTERVAL 1 DAY,
            ' ',
            CURTIME()
        )
        AND vs2.sp_utm_source = vs.sp_utm_source
    ) AS rate
FROM vtiger_salesorder vs
INNER JOIN vtiger_crmentity vc ON vs.salesorderid = vc.crmid
AND vs.createdtime BETWEEN (CURDATE() - INTERVAL 1 DAY) AND CURDATE()
GROUP BY  vs.sp_utm_source
READ ALSO
Удаление дублей в json array java

Удаление дублей в json array java

Имеется JSON файл с информацией о более чем 26 тысаэропортов с такими данными:

461
vk api авторизация

vk api авторизация

При попытке отправки запроса на code в ответе нет заголовка "location"Находил рекомендацию отключить следование редиректу

426
Как запустить клиент и подключиться к серверу в AsyncTask?

Как запустить клиент и подключиться к серверу в AsyncTask?

Запускаю на компьютере через командную строку сервер с портом 6666Подскажите, как я могу к нему подключиться, нажав на кнопку в эмуляторе? У меня...

428
Мониторинг подключений к серверу на Java

Мониторинг подключений к серверу на Java

Мне нужно чтобы программа получала список всех IP адресов, обращающихся к моему серверу, и я мог получить этот списокРаботаю в линуксовом...

333