2016-10-19 3 views
0

주어진 문제에 대해 쿼리를 작성해야하는 데이터베이스 관리 시스템에 할당이 있습니다. 나는 4 가지 문제를 가지고 있는데, 그 중 3 가지를 해결하고 마지막 문제를 고집했다.SQLite - null 인 경우 0을 반환합니다.

세부 사항 :

  • 치누크 데이터베이스 (https://chinookdatabase.codeplex.com/)의 1.4 버전을 사용.
  • SQLite는 DB 브라우저
  • 치누크 SQLite는 AutoIncrementPKs.sqlite 치누크 파일과 디렉토리에 파일은 내가

문제 문에 작업하고있는 데이터베이스입니다 : 쿼리를 작성 고객 지원 담당자 인 고객 송장을 통해 가져온 금액을 기준으로 직원 순위 목록을 생성합니다. 결과 세트 (아래 그림 참조)에는 ID (e_id), 이름 (e_first 이름), 성 (e_last_name), 직위 (모든 고객을 지원하지 않는 직원 포함)의 모든 직원에 대해 다음 필드가 순서대로 있어야합니다. (e_title) 및 송장 합계 (total_invoices)가 포함됩니다. 행은 인보이스 합계 (가장 큰 것부터), 성 (알파벳 순서), 이름 (알파벳순) 순으로 정렬되어야합니다. 송장 합계는 달러 기호 ($)로 시작해야하며 소수점 이하 두 자리 (반올림 됨)가 있어야합니다. 인보이스가없는 직원의 경우 NULL이 아닌 $ 0.00을 출력해야합니다. SQLite의 IFNULL, ROUND 및 PRINTF 함수를 살펴 보는 것이 유용 할 수 있습니다.

원하는 출력 :

enter image description here

내 쿼리 :

Select Employee.EmployeeId as e_id, 
      Employee.FirstName as e_first_name, 
      Employee.LastName as e_last_name, 
      Employee.Title as e_title, 
      '$' || printf("%.2f", Sum(Invoice.Total)) as total_invoices 
From Invoice Inner Join Customer On Customer.CustomerId = Invoice.CustomerId 
        Inner Join Employee On Employee.EmployeeId = Customer.SupportRepId 
Group by Employee.EmployeeId 
Having Invoice.CustomerId in 
(Select Customer.CustomerId From Customer 
Where Customer.SupportRepId in 
     (Select Employee.EmployeeId From Employee Inner Join Customer On Employee.EmployeeId = Customer.SupportRepId) 
) 
order by sum(Invoice.Total) desc 

내 출력 :

enter image description here

보시다시피, 처음 세 행은 정확하지만 직원에게는 인보이스가 없으므로 EmployeeID가 null이므로 이후 행이 인쇄되지 않습니다.

어떻게이 조건으로 행을 인쇄합니까? 시도해 보니 합쳐서ifnull이 작동하지만 작동하지 못합니다.

누군가 내 쿼리를 수정하여 일치하는 솔루션을 얻을 수 있다면 정말 고맙겠습니다. 감사합니다.

피.S : 이것은 종종 하위 쿼리를 사용하는 간단한 것을 어떻게

enter image description here

답변

1

치누크 데이터베이스의 스키마입니다 :

SELECT EmployeeId, 
     FirstMame, 
     LastName, 
     Title, 
     (SELECT printf("...", ifnull(sum(Total), 0)) 
     FROM Invoice 
     JOIN Customer USING (CustomerId) 
     WHERE Customer.SupportRepId = Employee.EmployeeId 
     ) AS total_invoices 
FROM Employee 
ORDER BY total_invoices DESC; 

(내부도 하위 쿼리로 대체 될 수 가입 할 수 있습니다.)

그러나 일치하는 행을 찾을 수없는 경우 NULL 값을 포함하는 가짜 행을 생성하는 outer joins에 대해 학습했다는 것을 보여줄 수 있습니다.

... 
FROM Employee 
LEFT JOIN Customer ON Employee.EmployeeId = Customer.SupportRepId 
LEFT JOIN Invoice USING (CustomerID) 
... 

그리고 스마트 서스가되고 싶다면 ifnull(sum(...), 0)total(...)으로 바꿉니다.

+0

대단히 감사합니다. 그것은 일했다 :) – user3397557

관련 문제