检索行中的不同值并计算总数

Retrieving distinct values in rows and counting total

只是寻找关于我的问题的任何信息,不一定是确切的答案。

我有一个名为 WorkDay 的 table。

在工作日Table中,有6个字段:

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

可以为员工分配多个角色,也有一些字段为 NULL。

我想编写一个查询,该查询将 return 分配给每个工作日的员工总数,但很明显,如果有一名员工被分配到 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 * 来自工作日:

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

我不确定是否要进行此查询。任何 information/pointers 将不胜感激。

看起来您的 table 可悲地非规范化了包含人名的多个列。您似乎想计算每天所有这些列中唯一值的数量。

尝试这样的事情来获取每一天的唯一值。这将返回一个以 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

这里需要 COUNT(Person) 而不是 COUNT(*),否则它会计算 NULL 个值,因此多算人数。