2015-01-19 2 views
0

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

SELECT EmployeeID, 
    SUM(CASE 
      WHEN Error1 = '0' 
       THEN 1 
      ELSE 0 
      END + CASE 
      WHEN Error2 = '0' 
       THEN 1 
      ELSE 0 
      END + CASE 
      WHEN Error3 = '0' 
       THEN 1 
      ELSE 0 
      END) AS TotalErrors 
FROM SubmittedDocuments 
GROUP BY EmployeeID 

Заявление должно рассчитать количество ошибок в таблице для каждого сотрудника. Однако в таблице SubmittedDocuments с именем «DocumentName» есть еще один столбец. Как написать заявление, которое учитывает только ошибки для первого экземпляра каждого DocumentName? (Или только для одного с самым низким «SubmittedID», уникальным идентификатором)

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

+0

Не работает ли группа по имени DocumentName? – Andrew

+0

Помогите нам воспроизвести ваш сценарий. Добавьте к своему вопросу базовые DML и DDL, чтобы у нас были данные для работы. Возможно, создайте [companion sqlfiddle] (http://sqlfiddle.com/) для вашего вопроса (добавьте все соответствующие коды в вопрос!). – Jeroen

ответ

2

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

SELECT EmployeeID 
    SUM(CASE WHEN DocIDErr > 1 THEN 0 ELSE 1 END) 
FROM 
(SELECT EmployeeID 
    , Error1 
    , ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY DocumentName) AS DocIDErr 
FROM SubmittedDocuments) AS RS 
GROUP BY EmployeeID 
+0

Спасибо, что дал мне информацию, необходимую для ее решения для меня. :) – JaGo

+0

@JaGo Рад, что это сработало для вас в конце :) –

2

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

Если да, то это может быть то, что вы хотите:

select sd.*, 
     ((case when error1 = '0' then 1 else 0 end) + 
     (case when error2 = '0' then 1 else 0 end) + 
     (case when error3 = '0' then 1 else 0 end) 
     ) as numerrors 
from (select sd.*, 
      row_number() over (partition by documentname order by submittedid) as seqnum 
     from SumittedDocuments sd 
    ) sd 
where seqnum = 1; 
+0

Спасибо, это помогло! :) – JaGo

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