2017-10-25 12 views
0

私の問題に関する情報を探しているだけで、必ずしも正確な答えではありません。行の異なる値を取得し、合計を計算する

私はWorkDayというテーブルを持っています。 Workdayの表において

は、6つのフィールドがあります

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

従業員が複数の役割を割り当てることができ、NULLであるいくつかのフィールドもあります。

各就業日に割り当てられた従業員の総数を返すクエリを作成したいと思いますが、明らかに、BossロールとTech2ロールに割り当てられている従業員が1人の従業員としてカウントされている場合です。

EDIT: これは私が望む出力です。

+------------+------------+----+ 
|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 | 
------------+------------+---- 

これはWorkdayの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値、したがって、オーバー人々をカウントする代わりに、ここでCOUNT(*)COUNT(Person)必要です。

+0

ありがとう!魅力のように働いた。私はちょうど質問することができます:MySQLはどのような人物が何であるか知っていますそれを定義するものはありません。この例では、SELECT(fields)FROM(arguments)Personを配置しています。それは動作しますが、私は人が何であるか分かりません。 – Eugeen

+0

'Persons'はサブクエリのエイリアスで、閉じ括弧の直後に宣言されます。あなたが 'SELECT FROM(いくつかのサブクエリ)エイリアス'と言うときは、サブクエリに 'エイリアス'名を与えなければなりません。あなたは好きな名前を使うことができます。 –

+0

サブクエリで 'union'を使用しましたので、従業員が上司と技術者の両方として割り当てるときに重複行が自動的に削除されます。 –

関連する問題