2014-10-19 3 views
0

У меня есть следующий запрос:MySQL Как вернуть COUNT в целом и также COUNT с помощью GROUP BY в одном запросе

SELECT location, COUNT(location) AS Total, (

SELECT location, COUNT(location) AS Responses 
FROM `trespondent` 
WHERE completion_status IN ('Started', 'Complete') 
GROUP BY location 
) 

FROM `trespondent` 
GROUP BY location 

Это возвращает ошибку:

Operand should contain 1 column(s)

что абсолютно верно так как будет несколько строк.

То, что я пытаюсь достичь в рамках одного запроса, состоит в том, чтобы вернуть общее число для каждого параметра в поле «Местоположение», а затем также число, которое «Началось» или «Завершено» для каждого параметра в «Расположение» ».

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

ответ

1

Вы можете изменить свой запрос, как показано ниже, используя UNION положение, чтобы использовать обе версии запроса и получить общий результат

SELECT location, COUNT(location) AS Total 
FROM `trespondent` 
GROUP BY location 

UNION ALL 

SELECT location, COUNT(location) AS Responses 
FROM `trespondent` 
WHERE completion_status IN ('Started', 'Complete') 
GROUP BY location 

или, возможно, с помощью JOIN присоединиться как результат запроса, как

SELECT t1.location as T1location, 
COUNT(t1.location) AS Total, 
tab.Responses, 
tab.location as tablocation 
FROM `trespondent` t1 
JOIN 
(
SELECT location, COUNT(location) AS Responses 
FROM `trespondent` 
WHERE completion_status IN ('Started', 'Complete') 
GROUP BY location 
) tab 
ON t1.location = tab.location 
GROUP BY t1.location 
+0

Опция с помощью «JOIN» именно то, что я искал. Стоит отметить, что «СОЮЗ» также предоставляет ту же информацию, но разложенную по-другому (по вертикали). Спасибо @Rahul. –

0

Как об этом?

SELECT location, COUNT(location) AS Total, 
     (SELECT COUNT(location) AS Responses 
     FROM `trespondent` 
     WHERE completion_status IN ('Started', 'Complete') 
     ) 
FROM `trespondent` 
GROUP BY location; 

То есть, подзапрос в общей сложности не нуждается в group by.

EDIT:

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

SELECT location, COUNT(*) AS Total, SUM(completion_status IN ('Started', 'Complete')) 
FROM `trespondent` 
GROUP BY location; 

Это кажется самым простым решением.

+0

@Gordon_Linoff - благодаря этому, к сожалению, он возвращает «то же» общее количество для каждого варианта в Location, что не то, что я искал. Спасибо всем тем же. –

+0

@Homer_J. , , ваш вопрос был неясным (мне) о том, что делать. Самое простое решение - это версия, которую я только что добавил. –

1

Вы можете использовать условную сумму для второго расчета:

SELECT 
    location, 
    COUNT(*) AS Total, 
    SUM(IF(completion_status IN ('Started', 'Complete'), 1, 0)) as 'Responses' 
FROM trespondent 
GROUP BY location 
Смежные вопросы