2014-02-10 3 views
0

Я пытаюсь создать запрос, который предоставит мне два отдельных COUNT в двух отдельных столбцах. Счет для приложений и счет для одобренных приложений. Я хочу, чтобы эти подсчеты отображались для каждого месяца в течение определенного промежутка времени. Подобно:Несколько GROUP BY с подзапросами

date  applications approvals 
January 20   3  
February 25   1 
March  20   4 
April  10   2 

При использовании подзапросов, я сгруппирован основной запрос, используя "GROUP BY МЕСЯЦА (APPL_CREATE_DT)". Проблема с этим заключается в том, что он только правильно сгруппировал первый столбец, в то время как в следующем столбце был одинаковый подсчет за каждый месяц. Если я добавлю тот же GROUP BY в другой раздел подзапроса, тогда я получу ошибку 1242.

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

SELECT 
COUNT(DISTINCT APPL_ID) AS Applications, 
(SELECT COUNT(DISTINCT APPL_ID) 
FROM APPL_APP 
JOIN APPU_APP_USER ON APPL_ID = APPU_APPL_ID 
LEFT JOIN APPD_APP_DECISION ON APPD_APPL_ID = APPL_ID 
WHERE APPD_STATUS = 'LENDER_APPROVED' 
    AND APPU_CUR_STATE = 'TX' 
    AND APPL_CREATE_DT >= '2013-01-01 00:00:00' 
    AND APPL_CREATE_DT <= '2014-01-31 23:59:59' 
GROUP BY MONTH(APPL_CREATE_DT)) AS Approvals 
FROM APPU_APP_USER 
JOIN APPL_APP ON APPL_ID = APPU_APPL_ID 
AND APPL_CREATE_DT >= '2013-01-01 00:00:00' 
AND APPL_CREATE_DT <= '2014-01-31 23:59:59' 
AND APPU_CUR_STATE = 'TX' 
GROUP BY MONTH(APPL_CREATE_DT); 
+0

В ваших подзапросах выберите только строки, где MONTH() соответствует MONTER() внешнего запроса: т. Е. Тот, который вы группируете по –

+0

. Все еще получая ту же ошибку. Я искал что-то вроде MONTH (внешнийTable.APPL_CREATE_DATE) = MONTH (inner_table.APPL_CREATE_DATE), но я не знаю, где его разместить, чтобы он работал. – user2356890

+0

Хороший способ задать эти вопросы - создать SqlFiddle и позволить людям изменить его для вас. Посмотрите этот пример: http://sqlfiddle.com/#!9/1e85d/5 Кроме того, если вы можете пересмотреть свой запрос как счетчик (*), вы можете, вероятно, подойти к нему по-другому, но это зависит от мощности отношения между App, AppUser и AppDecision. –

ответ

0

Чтобы все было просто, я удалил некоторые условия.

Как вы упомянули

Я посмотрел делать что-то вроде МЕСЯЦА (outerTable.APPL_CREATE_DATE) = МЕСЯЦ (inner_table.APPL_CREATE_DATE)

Вы правы.

, но я не знаю, куда поместить его, чтобы сделать его работу

Я надеюсь, что следующий запрос будет помочь вам.

SELECT 
    COUNT(DISTINCT APPL_ID) AS Applications, 
    (
     SELECT COUNT(DISTINCT APPL_ID) 
     FROM APPL_APP INNER JOIN APPU_APP_USER ON APPL_ID = APPU_APPL_ID 
      LEFT JOIN APPD_APP_DECISION ON APPD_APPL_ID = APPL_ID 
     WHERE APPD_STATUS = 'LENDER_APPROVED' 
      AND MONTH(APPL_CREATE_DT) = MONTH(t1.APPL_CREATE_DT) 
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^= This condition added 
     GROUP BY MONTH(APPL_CREATE_DT) 
    ) AS Approvals 
FROM APPL_APP t1 INNER JOIN APPU_APP_USER ON APPL_ID = APPU_APPL_ID 
       ^^===== Alias added 
GROUP BY MONTH(APPL_CREATE_DT); 

Обратите внимание, что коррелированный подзапрос MySQL имеет очень низкую производительность в моем опыте. Пожалуйста, подумайте о том, чтобы преобразовать ваш запрос с помощью только суб-запроса, если это возможно.

Смежные вопросы