MySQL подсчитывает ЕСЛИ и ПРИСОЕДИНЯЕТСЯ

У меня есть две таблицы:

  1. deskcases: | CaseID | Resolved At(Date) | Labels |

  2. ringcentral: | Date | Type | Action Result |

Моя цель - получить следующий результат за предыдущие 7 дней:

| Date | Count of TotalResolvedCases | Count of Total Calls |

Мне нужно подсчитать случаи и звонки в двух отдельных таблицах, затем объединить и сгруппировать подсчеты по дате. Я также имею дело с разным форматированием дат в двух таблицах, отсюда и дурацкие функции группировки и объединения.

Мне также нужно, чтобы объединение включало все даты за предыдущие 7 дней (у deskcases есть все даты, поэтому я подумал, что здесь должно работать ВНУТРЕННЕЕ СОЕДИНЕНИЕ?)

Чтобы закрыть, я попытался запустить следующий запрос ниже, и он просто сбивается безрезультатно через минуту или две. Любая идея о том, как заставить это работать? Заранее спасибо за вашу помощь! :-)

(запуск MySQL 5.0.96)

SELECT
DATE_FORMAT(
    deskcases.`Resolved At`,
    '%Y-%m-%d'
)AS Date1,
(
    SELECT
        COUNT(deskcases.`Case #`)
    FROM
        deskcases
    WHERE
        deskcases.Labels NOT LIKE '%SPAM%'
    AND deskcases.Labels NOT LIKE '%Online Orders%'
    AND deskcases.Labels NOT LIKE '%Internal SPAM%'
    AND deskcases.`Resolved At` > NOW()- INTERVAL 8 DAY
)AS TotalResolvedCases,
(
    SELECT
        COUNT(ringcentral.Counter)
    FROM
        ringcentral
    WHERE
        `ringcentral`.`Type` = 'Voice'
    AND `Action Result` = 'Accepted'
    AND ringcentral.`Date` > NOW()- INTERVAL 8 DAY
)AS TotalCalls
FROM
 deskcases
INNER JOIN ringcentral ON DATE_FORMAT(
 deskcases.`Resolved At`,
 '%Y-%m-%d'
)= ringcentral.Date
GROUP BY
 Date1
ORDER BY
 Date1 ASC

РЕДАКТИРОВАТЬ

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

SELECT
DATE_FORMAT(
    deskcases.`Resolved At`,
    '%Y-%m-%d'
)AS Date1,
(
    SELECT
        COUNT(deskcases.`Case #`)
    FROM
        deskcases
    WHERE
        deskcases.Labels NOT LIKE '%SPAM%'
    AND deskcases.Labels NOT LIKE '%Online Orders%'
    AND deskcases.`Case Status` LIKE '%Resolved%'
)AS TotalResolvedCases,
(
    SELECT
        COUNT(ringcentral.Counter)
    FROM
        ringcentral
    WHERE
        `ringcentral`.`Type` = 'Voice'
    AND `Action Result` = 'Accepted'
)AS TotalCalls
FROM
  deskcases
LEFT OUTER JOIN ringcentral ON DATE_FORMAT(
  deskcases.`Resolved At`,
  '%Y-%m-%d'
)= ringcentral.Date
WHERE deskcases.`Resolved At` > NOW()- INTERVAL 8 DAY
GROUP BY
  Date1
ORDER BY
  Date1 ASC

person hianalytics    schedule 19.03.2013    source источник


Ответы (1)


В этом случае вам определенно не следует присоединяться к свиданию.

Например, у вас могут быть такие данные:

deskcases                           ringcentral
---------                           -----------
date      | whatever_d              date      | whatever_r
----------------------              ----------------------
today       x                       yesterday   u
yesterday   y
yesterday   z

Теперь, когда вы присоединитесь к ним, вы получите следующее:

joinedTable
-----------
date      | whatever_d  |  whatever_r
-------------------------------------
today       x 
yesterday   y              u
yesterday   z              u

К сожалению, вы получили 2 записи из таблицы рингтонов, а хотели только 1.

Итак, как вы получаете свои данные? Либо напишите 2 утверждения, либо объедините их с UNION:

SELECT
DATE(`Resolved At`) AS Date1,
"Deskcases" AS fromTable,
COUNT(*) AS TotalNumber
FROM
        deskcases
    WHERE
        deskcases.Labels NOT LIKE '%SPAM%'
    AND deskcases.Labels NOT LIKE '%Online Orders%'
    AND deskcases.Labels NOT LIKE '%Internal SPAM%'
    AND deskcases.`Resolved At` > CURDATE()- INTERVAL 8 DAY
GROUP BY 1, 2
UNION ALL
SELECT
`Date` AS Date1,
"ringcentral" AS fromTable,
COUNT(*) AS TotalNumber
FROM
        ringcentral
    WHERE
        `ringcentral`.`Type` = 'Voice'
    AND `Action Result` = 'Accepted'
    AND ringcentral.`Date` > CURDATE()- INTERVAL 8 DAY
GROUP BY 1, 2

Также обратите внимание, что я изменил NOW() на CURDATE(). В таблице desktopcases ваш столбец даты кажется отметкой времени. Когда вы вычтете 8 дней из «2013-03-20 10:06:00», вы получите «2013-03-12 10:06:00», и поэтому вы пропустите все строки между «2013-03-12». 00:00:00» и «2013-03-12 10:05:59». Также я просто использовал функцию DATE() вместо DATE_FORMAT(). DATE_FORMAT() — действительно хорошая и полезная функция во многих отношениях, но в этом случае при использовании DATE() вам придется вводить меньше символов :)

ОБНОВЛЕНИЕ:

SELECT 
Date1, 
SUM(CASE WHEN fromTable = 'Deskcases' THEN TotalNumber ELSE 0 END) AS TotalDeskcases,
SUM(CASE WHEN fromTable = 'ringcentral' THEN TotalNumber ELSE 0 END) AS TotalRingcentral 
FROM (
SELECT
DATE(`Resolved At`) AS Date1,
'Deskcases' AS fromTable,
COUNT(*) AS TotalNumber
FROM
        deskcases
    WHERE
        deskcases.Labels NOT LIKE '%SPAM%'
    AND deskcases.Labels NOT LIKE '%Online Orders%'
    AND deskcases.Labels NOT LIKE '%Internal SPAM%'
    AND deskcases.`Resolved At` > CURDATE()- INTERVAL 8 DAY
GROUP BY 1, 2
UNION ALL
SELECT
`Date` AS Date1,
'ringcentral' AS fromTable,
COUNT(*) AS TotalNumber
FROM
        ringcentral
    WHERE
        `ringcentral`.`Type` = 'Voice'
    AND `Action Result` = 'Accepted'
    AND ringcentral.`Date` > CURDATE()- INTERVAL 8 DAY
GROUP BY 1, 2
) sq
GROUP BY Date1
person fancyPants    schedule 20.03.2013
comment
Спасибо за эту могилу! Я определенно согласен со всеми вашими пунктами и спасибо за советы по функциям даты. Однако проблема все еще существует: я получаю синтаксическую ошибку, когда пытаюсь запустить ваш код: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «COUNT (*) AS TotalNumber FROM deskcases WHERE deskcases.Labels NOT LIKE '%SPAM%'' в строке 3 - person hianalytics; 20.03.2013
comment
@user1812363 Как-то там что-то потерялось, поправил. Пожалуйста, попробуйте еще раз. - person fancyPants; 20.03.2013
comment
Теперь это работает, и я вижу данные! Единственная проблема заключается в том, что я передаю этот запрос в PHP-скрипт, чтобы представить эти данные на панели инструментов. Я заметил, что вы сообщили мне, что мы не должны присоединяться к дате, но я не знаю, как действовать дальше, поскольку это то, что мне нужно :-( - person hianalytics; 20.03.2013
comment
@user1812363 user1812363 Попробуйте обновить в моем ответе. Не уверен, что правильно понял задачу. - person fancyPants; 20.03.2013
comment
СПАСИБО! :-) Пару дней бился головой о стену над этой проблемой, а также над тем, как принципиально подойти к этому сценарию. Вы не представляете, как это здорово для меня. Я очень ценю вашу последующую помощь. - person hianalytics; 20.03.2013
comment
@user1812363 user1812363 Вы также можете проголосовать за меня, так как вы так благодарны ;) - person fancyPants; 20.03.2013