2014-10-16 2 views
0

안녕하세요, 레일즈 애플리케이션에서이 쿼리를 사용하고 있습니다. 나는 고유 직원의 수를 찾으려고 노력 중입니다. 그래서 얼마나 많은 (duplicatesid_number을 사용했는지) duplicates이 얼마나 많은지를 파악한 total_employees이 얼마나 많은지를 알아낼 하나의 쿼리를 작성했습니다. 그 다음 나는 total_employees에서 duplicates을 뺀다. id_number 필드는 필수가 아니므로 id_number의 값이 null이어야합니다.Nails 값을 빼는 레일/SQL 문

문제는 duplicates이 null 인 경우 쿼리를 실행하면 unique_employees의 수가 null이됩니다. 여기

그래서 나는 점점 오전 내 쿼리

 SELECT SUM(total_count.count) - SUM(duplicate_count.count) as unique_employees, SUM(total_count.count), SUM(duplicate_count.count) 
    FROM (
     SELECT COUNT(1) as count 
     FROM participants 
     JOIN training_programs 
      ON training_programs.id = participants.training_program_id 
     WHERE training_programs.category IN ('B', 'C', 'D') 
      AND training_programs.skills_development_id = 123 
      AND participants.foreign = FALSE 
      AND participants.race = 'African' 
      AND participants.gender = 'Male' 
      AND participants.employed = true 
    ) as total_count, 
     (SELECT SUM(count) as count 
     FROM (SELECT COUNT(id_number)-1 AS count 
     FROM participants 
     JOIN training_programs 
      ON training_programs.id = participants.training_program_id 
     WHERE training_programs.category IN ('B', 'C', 'D') 
      AND training_programs.skills_development_id = 123 
      AND participants.foreign = FALSE 
      AND participants.race = 'African' 
      AND participants.gender = 'Male' 
      AND participants.employed = true 
      AND participants.id_number <> '' 
     GROUP BY id_number 
     HAVING COUNT(id_number) > 1) as duplicated_records 
    ) as duplicate_count 

인이

query_results

내 SQL foo는 세계 최고의 내가 모든 방법을 알아 내려고 노력하고 있어요되지 않도록 Null 값을 0으로 볼 수 있습니다. 루프에서 실행되고 제공된 입력에 따라 저장 당 수십 번 다시 실행해야하기 때문에이 쿼리를 단일 쿼리 내에서 사용하고 싶습니다.

또는 위의 도움말은 유용 할 것입니다. 사전

편집

감사가 나는 쿼리가 잘 실행 중복 추가 할 수 있었다면. 그래서 쿼리는 상관없이 아무 중복이없는 경우 total_empolyees의 수는 쿼리가 0

답변

1

그냥 잠재적으로 정확하게이었다 IFNULL

SUM(IFNULL(duplicate_count.count,0)) 
+0

야에 널 (null)을 얻을 수있는 모든 값을 둘러싸고 돌려 보낼 단지 좋은 나는 무엇을 찾고 있었습니까! 정말 고맙습니다. 나는이 벽을 하루 종일 때렸다. – TheLegend

+0

나는 실제 문제를 반영하기 위해 질문 이름을 편집했다. – TheLegend