检索行中的不同值并计算总数
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
个值,因此多算人数。
只是寻找关于我的问题的任何信息,不一定是确切的答案。
我有一个名为 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
个值,因此多算人数。