2015-01-06 2 views
-1

В настоящее время я работаю над запросом, который покажет мне общее количество полученных приложений и количество тех из них, которые соответствуют определенному статусу приложения. Затем он будет сгруппирован по статусу и клиенту. Смотрите ниже:Проблема с подсчетом подсчета итогов

SELECT STATE AS State1, CLIENT AS Client1, COUNT(DISTINCT ID) AS Count1, 
(SELECT COUNT(DISTINCT APPLICATION_ID) 
FROM APPLICATION TABLE 1 
LEFT JOIN APPLICATION TABLE 2 ON ID1 = ID2 
WHERE STATUS = 'APPROVED' 
AND DATE_FORMAT(CREATE_DT, '%Y-%m-%d') = '2013-03-28') AS COUNT2 
FROM APPLICATION TABLE 
JOIN USER TABLE ON USER_ID = ID 
LEFT JOIN DECISION TABLE ON DECISITON_ID = ID 
WHERE DATE_FORMAT(CREATE_DT, '%Y-%m-%d') = '2013-03-28' 
GROUP BY STATE, CLIENT; 

Выходной сигнал будет что-то вроде ниже:

State Client  App Count  Approved Count 
AL  Client 1  2    1 
AL  Client 2  4    3 
AL  Client 3  10    2 
TX  Client 1  9    6 
TX  Client 4  4    3 
KS  Client 6  6    4 
KS  Client 9  12    10 

Однако, я получаю следующее:

State Client  App Count  Approved Count 
AL  Client 1  2    29 
AL  Client 2  4    29 
AL  Client 3  10    29 
TX  Client 1  9    29 
TX  Client 4  4    29 
KS  Client 6  6    29 
KS  Client 9  12    29 

Что я могу сделать, чтобы подвести вторичный подсчет приложения в этом конкретном состоянии правильно?

+0

Если вам нравится, рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. – Strawberry

ответ

0

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

SELECT STATE AS State1, CLIENT AS Client1, COUNT(DISTINCT ID) AS Count1, 
SUM(STATUS = 'APPROVED') as Count2 
FROM APPLICATION 
JOIN USER ON USER_ID = ID 
LEFT JOIN DECISION ON DECISITON_ID = ID 
WHERE DATE_FORMAT(CREATE_DT, '%Y-%m-%d') = '2013-03-28' 
GROUP BY STATE, CLIENT; 
0

Когда вы делаете ваш подзапрос вызов, вы не коррелируют с группировками. Таким образом, сумма подзапросов по всей таблице (для утвержденных статусов, конечно), и поэтому вы получаете одинаковый результат в каждой строке. Чтобы это исправить, необходимо включить ограничение на состояние и клиента в вашем подзапрос, например, так:

SELECT STATE AS State1, CLIENT AS Client1, COUNT(DISTINCT ID) AS Count1, 
(SELECT COUNT(DISTINCT APPLICATION_ID) 
FROM APPLICATION AS INNER_APPLICATION 
LEFT JOIN APPLICATION_2 ON ID1 = ID2 
WHERE STATUS = 'APPROVED' 
-- these two lines make it work 
AND INNER_APPLICATION.STATE = APPLICATION.STATE 
AND INNER_APPLICATION.CLIENT = APPLICATION.CLIENT 
AND DATE_FORMAT(CREATE_DT, '%Y-%m-%d') = '2013-03-28') AS COUNT2 
FROM APPLICATION 
JOIN USER TABLE ON USER_ID = ID 
LEFT JOIN DECISION TABLE ON DECISITON_ID = ID 
WHERE DATE_FORMAT(CREATE_DT, '%Y-%m-%d') = '2013-03-28' 
GROUP BY STATE, CLIENT; 

мне пришлось переименовать некоторые из ваших таблиц, потому что они имели места в них, и это было не понятно, почему.

Поскольку вы присоединяетесь к другой таблице в своем подзапросе, вы не можете использовать ответ @ radar. Однако, если подзапрос подсчитывал ту же таблицу, что и внешний запрос, тогда вы можете сделать это без каких-либо проблем.

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