2013-06-27 3 views
4

У меня есть одна таблица в следующем формате:Выберите несколько счетчиков из таблицы одной базы данных в доступе к командной один SQL

STATE SURVEY_ANSWER 
NC high 
NC moderate 
WA high 
FL low 
NC high 

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

STATE HIGH MODERATE LOW 
NC 2 1 0 
WA 1 0 0 
FL 0 0 1 

К сожалению, эти результаты я получаю:

STATE HIGH MODERATE LOW 
NC 3 1 1 
WA 3 1 1 
FL 3 1 1 

Вот код, я использую:

Select mytable.STATE, 
(SELECT COUNT(*) FROM mytable WHERE mytable.survey_answer = 'low' and state = mytable.state) AS low, 
(SELECT COUNT(*) FROM mytable WHERE mytable.survey_answer = 'moderate' and state = mytable.state) AS moderate, 
(SELECT COUNT(*) FROM mytable WHERE mytable.survey_answer = 'high' and state = mytable.state) AS high, 
FROM mytable 
GROUP BY mytable.state; 

Хотя этот и другие форумы были очень полезными, я не могу понять, что я делаю неправильно. ОБРАТИТЕ ВНИМАНИЕ: Я использую Access так, что решения CASE WHEN не работают. Спасибо за любой совет.

ответ

4

Похоже, что это может быть проблема, вызванная не использованием псевдонимов таблиц. Поскольку вы выполняете подзапросы в той же таблице, что внешний SELECT использует и не дает внешней таблице псевдоним, оба условия в подзапросе WHERE используют только данные в подзапросе.

Другими словами, когда вы пишете:

SELECT COUNT(*) FROM mytable WHERE mytable.survey_answer = 'low' and state = mytable.state 

Он ничего не знает о внешнем запросе не знаю.

Попробуйте это:

SELECT t1.STATE, 
    (SELECT COUNT(*) FROM mytable t2 WHERE t2.state = t1.state AND t2.survey_answer = 'low') low, 
    (SELECT COUNT(*) FROM mytable t3 WHERE t3.state = t1.state AND t3.survey_answer = 'moderate') moderate, 
    (SELECT COUNT(*) FROM mytable t4 WHERE t4.state = t1.state AND t4.survey_answer = 'high') high, 
FROM mytable t1 
GROUP BY t1.state 
+0

Отлично, спасибо за помощь. Это решение отлично работало для меня. – user2529187

2

Aiias ответ объясняет, почему ваш текущий запрос не работает, но я думал, что я укажу, что ваше предположение, что вы не можете использовать CASE WHEN решения является лишь отчасти, да вы не можете использовать CASE WHEN, но это не значит, что вам нужны коррелированные подзапросы. Вы можете просто использовать:

SELECT mytable.STATE, 
     SUM(IIF(mytable.survey_answer = 'low', 1, 0) AS low, 
     SUM(IIF(mytable.survey_answer = 'moderate', 1, 0) AS moderate, 
     SUM(IIF(mytable.survey_answer = 'high', 1, 0) AS high 
FROM mytable 
GROUP BY mytable.state; 
+0

Спасибо за подсказку. – user2529187