2014-11-11 2 views
1

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

| Contact | Incident | OpenTime | Country | Product | 
| C1 |   | 1/1/2014 | MX | Office | 
| C2 | I1 | 2/2/2014 | BR | SAP | 
| C3 |   | 3/2/2014 | US | SAP | 
| C4 | I2 | 3/3/2014 | US | SAP | 
| C5 | I3 | 3/4/2014 | US | Office | 
| C6 |   | 3/5/2014 | TW | SAP | 

Я хочу выполнить запрос с критериями по стране и и открытого времени, и я хочу получить обратно что-то вроде этого:

| Product | Contacts with | Incidents | 
|   | no Incidents |   | 
| Office |  1  |  1  | 
| SAP |  2  |  2  | 

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

SELECT Service, count(
FROM database 
WHERE criterias AND Incident is Null //(or Not Null) depending on the row 
GROUP BY Product 

Что я ул прогибание - подсчет Инцидент - это Null, а Инцидент не является нулем в той же таблице в результате того же запроса, что и в приведенном выше примере.

Я попытался следующий

SELECT Service AS Service, 
(SELECT count Contacts FROM Database Where Incident Is Null) as Contact, 
(SELECT count Contacts FROM Database Where Incident Is not Null) as Incident 
FROM database 
WHERE criterias AND Incident is Null //(or Not Null) depending on the row 
GROUP BY Product 

Вопрос у меня есть с выше предложения является то, что независимо от критериев Я использую на «основной» выберите игнорируются вложенными Selects.

Я также пытался использовать UNION ALL, но не смог заставить его работать.

В конце концов я решил его с этим подходом: Я подсчитал общее количество контактов в продукт, подсчитывали число инцидентов, и добавил вычисляемое поле с результатом

SELECT Service, COUNT (Contact) AS Total, COUNT (Incident) as Incidents, 
(Total - Incident) as Only Contact 
From Database 
Where <criterias> 
GROUP BY Service 

Хотя я заставить его работать, я до сих пор уверен, что для него существует более элегантный подход. Как я могу получить различные подсчеты в одном столбце с разными критериями подсчета в одном запросе?

ответ

3

Просто используйте условную агрегацию:

SELECT Product, 
     SUM(IIF(incident is not null, 1, 1)) as incidents, 
     SUM(IIF(incident is null, 1, 1)) as noincidents 
FROM database 
WHERE criterias 
GROUP BY Product; 
3

Возможно, очень решение MS Access подойдет:

TRANSFORM Count(tmp.Contact) AS CountOfContact 
SELECT tmp.Product 
FROM tmp 
GROUP BY tmp.Product 
PIVOT IIf(Trim([Incident] & "")="","No Incident","Incident"); 

Это IIf(Trim([Incident] & "")="" охватывает все возможности Null строки, Null и пространства, заполненную.

tmp - это название таблицы.

+0

Это отличный ответ. Я хожу по Гордону или простоту, но наверняка я тоже буду использовать их – Gabriel

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