2017-10-25 11 views
0

을 계산하면 내 문제에 대한 정보를 찾지 만 반드시 정확한 대답은 아닙니다.행에서 고유 값을 검색하고 총계로

나는 WorkDay라는 테이블이 있습니다. 근무 표에

는 6 개 필드가 있습니다 :

Date_of_Workday, Workday_type, Boss, Regular, Tech1, Tech2. 

종업원 할당 할 수있는 여러 역할과 NULL있는 몇 가지 필드도 있습니다.

각 근무일에 할당 된 총 직원 수를 반환하는 쿼리를 작성하고 싶지만 Boss 역할과 Tech2 역할에 할당 된 직원이있는 경우 분명히 한 명의 직원으로 계산됩니다.

편집 : 이것은 원하는 출력입니다.

+------------+------------+----+ 
|Date_of_Work| Work_type | | 
+------------+------------+----+ 
| 2019-02-09 | AM   | 4 | 
| 2019-02-09 | PM   | 4 | 
| 2019-02-10 | AM   | 3 | 
| 2019-02-10 | PM   | 2 | 
| 2019-02-11 | AM   | 4 | 
| 2019-02-11 | PM   | 4 | 
| 2019-02-12 | AM   | 4 | 
| 2019-02-12 | PM   | 4 | 
| 2019-02-13 | AM   | 4 | 
| 2019-02-13 | PM   | 4 | 
------------+------------+---- 

이 워크 데이 SELECT * FROM입니다 :

+------------+------------+---------+----------+-----------+-----------+ 
| DateofWork | workday_typ | Boss | Regular | Tech1 | Tech2 | 
+------------+------------+---------+----------+-----------+-----------+ 
| 2019-02-09 | AM   | LB1  | AW1  | AE1  | JE1  | 
| 2019-02-09 | PM   | AE1  | IM1  | AL1  | BJ1  | 
| 2019-02-10 | AM   | AE1  | MM1  | MW1  | NULL  | 
| 2019-02-10 | PM   | AE1  | AE1  | EB1  | NULL  | 
| 2019-02-11 | AM   | LB1  | AB1  | DJ1  | JP1  | 
| 2019-02-11 | PM   | LB1  | JE1  | AB2  | BJ1  | 
| 2019-02-12 | AM   | LB1  | NS1  | AE1  | MB1  | 
| 2019-02-12 | PM   | LB1  | HP1  | EH1  | AL1  | 
| 2019-02-13 | AM   | LB1  | EB2  | ME1  | MM1  | 
| 2019-02-13 | PM   | LB1  | ME2  | AB2  | DJ1  | 
+------------+------------+---------+----------+-----------+-----------+ 

내가이 쿼리에 대해 갈로 확실입니다. 모든 정보/포인터 크게 감사하겠습니다.

+1

아직 코드를 작성하지 않으려 고 시도 했습니까? – Adam

+0

테이블 내용의 샘플을 제공하면 도움이 될 수 있습니다. 그 분야에 나타나는 것은 무엇입니까? 진실과 거짓? 근무일 테이블에 연결되는 직원 테이블이 있습니까? 데이터베이스의 관련 테이블에 대한 자세한 내용이 필요합니다. – Ambulare

+0

WorkDay 테이블에 연결된 Employees 테이블이 있습니다. PK는 WorkDay 테이블의 Boss, Regular, Tech1 및 Tech2 필드의 FK 인 Employee_Code입니다. 각 종업원은 기본적으로 종업원 코드를 가지고 있습니다. 관리자 열의 고유 값과 같은 각 열의 DISTINCT COUNT를 표시하도록 출력을 쉽게 얻을 수는 있지만 개별 행을 세어 계산할 수는 없습니다. – Eugeen

답변

1

비 정규화 된 테이블에는 여러 개의 열이 있고 사람들의 이름이 들어있는 것처럼 보입니다. 매일이 모든 열의 고유 값 수를 계산하려고합니다.

매일 같이 고유 한 값을 얻으려면 이와 같은 방법을 시도해보십시오. 이것은 Date_of_Workday, Workday_Type, Person으로 설정된 결과를 열로 제공합니다. UNION을 사용하면 중복되는 Person 값이 제거됩니다.

  SELECT Date_of_Workday, Workday_Type, Boss AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Regular AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Tech1 AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Tech2 AS Person FROM tbl 

는 다음과 같이 집계 쿼리에서 그 하위 쿼리를 사용 : (http://sqlfiddle.com/#!9/f1320a/1/0)

SELECT Date_of_Workday, Workday_Type, COUNT(Person) AS PersonCount 
    FROM (
      SELECT Date_of_Workday, Workday_Type, Boss AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Regular AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Tech1 AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Tech2 AS Person FROM tbl 
     ) Persons 
GROUP BY Date_of_Workday, Workday_Type 

당신은 그렇지 않으면 NULL 값 때문에 overcount 사람을 계산합니다, 대신 여기 COUNT(*)COUNT(Person)해야합니다.

+0

대단히 감사합니다! 매력처럼 일했습니다. MySQL은 Persons가 무엇인지 어떻게 알 수 있습니까? 그것의 정의 또는 아무것도 없다. 지금까지 볼 수 있듯이이 예제에서는 SELECT (fields) FROM (arguments) Person을 입력했습니다. 그것은 작동하지만, 나는 인물이 무엇인지 잘 모릅니다. – Eugeen

+0

'Persons'는 하위 괄호의 별칭으로 닫는 괄호 바로 뒤에 선언됩니다. 'SELECT FROM (some sub query) Alias'라고 말할 때 하위 쿼리에'Alias' 이름을 주어야합니다. 그렇지 않으면 SQL은 그것을 가져 가지 않습니다.원하는 이름을 사용할 수 있습니다. –

+0

하위 쿼리에서'union '을 사용 했으므로 직원이 보스 및 기술 담당자로 할당 할 때 중복 행이 자동으로 제거됩니다. 1. 맞습니까? –