2010-10-21 2 views
1

У меня есть следующая таблица: alt textПроблемы с работой SQL UNION

Я пытаюсь создать запрос SQL, который возвращает таблицу, которая возвращает три поля: года (ActionDate), граф Встроенных (ActionType = 12), Count of Lost (actiontype = несколько разных) Bascially, ActionType - это код поиска. Итак, я хотел бы получить ответ что-то вроде:

 YEAR CountofBuilt CountofLost 
     1905  30   18 
     1929  12   99 
     1940  60   1 
etc.... 

Я полагал, что это было бы взять два ЗЕЬЕСТ вместе взятые с UNION. Я пробовал следующее ниже, но он только отплевывает два столбца (год и счет). Мой countLost поле не появляется

My SQL в настоящее время (MS Access):

SELECT tblHist.ActionDate, Count(tblHist.ActionDate) as countBuilt 
FROM ... 
WHERE ((tblHist.ActionType)=12) 
GROUP BY tblHist.ActionDate 
UNION 
SELECT tblHist.ActionDate, Count(tblHist.ActionDate) as countLost 
FROM ... 
WHERE (((tblHist.ActionType)<>2) AND 
((tblHist.ActionType)<>3)) 
GROUP BY tblHist.ActionDate; 
+0

'UNION' удалят дубликаты, так что вы, может быть отсутствие данных ; 'UNION ALL' не будет удалять дубликаты. –

ответ

3

Использование:

SELECT h.actiondate, 
     SUM(IIF(h.actiontype = 12, 1, 0)) AS numBuilt, 
     SUM(IIF(h.actiontype NOT IN (2,3), 1, 0)) AS numLost 
    FROM tblHist h 
GROUP BY h.actiondate 
+0

Я получаю сообщение об ошибке «Синтаксическая ошибка (отсутствующий оператор) в выражении запроса« СУМ »(CASE WHEN tblHist.ActionType = 12 THEN 1 ELSE 0 END) ' – stuttsdc

+0

@stuttsdc: обновить страницу - я заметил, что вы использовали Access после публикации ответьте и обновите. –

+0

Посмотрите, как вы его обновили. Ну, я все еще получаю сообщение об ошибке: Синтаксическая ошибка (отсутствующий оператор) в выражении запроса «СУММ (IIF (tblHist.ActionType = 12 THEN 1 ELSE 0 END)) – stuttsdc

1

Вы не должны использовать UNION для таких запросов. Есть много способов сделать то, что вы хотите, например Обновлено соответствовать синтаксису ACCESS

SELECT tblHist.ActionDate, 
COUNT(SWITCH(tblHist.ActionType = 12,1)) as countBuilt, 
COUNT(SWITCH(tblHist.ActionType <>1 OR tblHist.ActionType <>2 OR ...,1)) as countLost 
FROM .. 
WHERE .... 
GROUP BY tblHist.ActionDate 
+0

Для условных выражений для создания countLost мне почти легче указать, что ActionType #s не следует использовать. Например, если я хочу, чтобы все ActionTypes не были 2, 3 или 9, могу ли я просто подключить это к <Другие числа> выше или ожидать другого? Могу ли я ввести диапазон чисел? – stuttsdc

+1

Вы можете ввести любое условие, которое вы хотите ('IN',' NOT IN', результат подзапроса и т. Д.). – a1ex07

+0

Идея состоит в том, что 'COUNT' возвращает количество ненулевых значений, а' CASE' имеет значение по умолчанию 'ELSE NULL'; – a1ex07

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