[英]Make a count of rows in query table
我有4个不同的表:
username table:
| uid | username | user_type|
+-----+----------+----------+
| 1 | Aaron | CT |
| 2 | Ahmad | FT |
| 3 | Akir | CT |
| 4 | Adelyn | FT |
| 4 | Adeeb | AP |
| 4 | Aizad | FT |
| 4 | Adeline | AP |
proc_leader table:
| projectNo | process | proc_leader|
+-----------+---------+------------+
| 170001 | ANM BLD | Aaron |
| 170001 | BGD COL | Ahmad |
proc_checker table:
| projectNo | process | proc_checker |
+-----------+---------+--------------+
| 170001 | ANM BLD | Adeeb |
| 170001 | ANM BLD | Adeline |
| 170001 | BGD COL | Aizad |
proc_staff table:
| projectNo | process | proc_staff |
+-----------+---------+------------+
| 170001 | ANM BLD | Aaron |
| 170001 | ANM BLD | Adelyn |
| 170001 | ANM BLD | Ahmad |
| 170001 | BGD COL | Akir |
然后,我UNION
所有表以创建一个表并获取每个用户的user_type
:
SELECT a.*FROM(
(
SELECT * FROM proc_leader t1 LEFT JOIN(
SELECT username, user_type FROM user GROUP BY username
) t2 ON t1.proc_leader = t2.username GROUP BY t1.proc_leader
) UNION(
SELECT * FROM proc_checker t1 LEFT JOIN(
SELECT username, user_type FROM user GROUP BY username
) t2 ON t1.proc_checker = t2.username GROUP BY t1.proc_checker
) UNION(
SELECT * FROM proc_staff t1 LEFT JOIN(
SELECT username, user_type FROM user GROUP BY username
) t2 ON t1.proc_staff = t2.username GROUP BY t1.proc_staff
)
) AS a
ORDER BY a.projectNo
现在我的输出是:
| projectNo | process | proc_leader | user_type |
+-----------+---------+-------------+-----------+
| 170001 | ANM BLD | Adeeb | AP |
| 170001 | ANM BLD | Adelyn | FT |
| 170001 | BGD COL | Ahmad | FT |
| 170001 | BGD COL | Aizad | FT |
| 170001 | BGD COL | Akir | CT |
| 170001 | ANM BLD | Aaron | CT |
| 170001 | ANM BLD | Adeline | AP |
| 170001 | BGD COL | Ahmad | FT |
然后我要做的是为每个进程计算user_type
并将其放在一个单元格中。 所以我希望我的输出是这样的:
| projectNo | process | count |
+-----------+---------+-------------------+
| 170001 | ANM BLD | 1(CT)+2(AP)+2(FT) |
| 170001 | BGD COL | 2(FT)+1(CT) |
我知道可以使用GROUP_COncat()
将其放在一个单元格中,但是如何从接收到的表中进行计算呢?
尝试这个:
select
projectNo,
process,
GROUP_CONCAT(col separator '+') `count`
from (
SELECT
projectNo,
process,
concat(count(*),'(',user_type,')') col
FROM(
(
SELECT * FROM proc_leader t1 LEFT JOIN(
SELECT username, user_type FROM user GROUP BY username
) t2 ON t1.proc_leader = t2.username GROUP BY t1.proc_leader
) UNION(
SELECT * FROM proc_checker t1 LEFT JOIN(
SELECT username, user_type FROM user GROUP BY username
) t2 ON t1.proc_checker = t2.username GROUP BY t1.proc_checker
) UNION(
SELECT * FROM proc_staff t1 LEFT JOIN(
SELECT username, user_type FROM user GROUP BY username
) t2 ON t1.proc_staff = t2.username GROUP BY t1.proc_staff
)
) AS a
group by projectNo, process, user_type
) t group by projectNo, process;
您不需要LEFT JOIN
UNION
中包含的每个表。 而是,只需使用一个UNION
子查询并将其联接到username
名表即可。
在下面的查询中,即使计数为零,我也会为每个projectNo
process
组报告所有三种用户类型。 如果您真的不希望用户类型在其计数为零的情况下完全出现,那么您将需要做更多的工作。
SELECT t2.projectNo,
t2.process,
CONCAT(
CAST(SUM(CASE WHEN t1.user_type = 'CT' THEN 1 ELSE 0 END) AS CHAR(50)), '(CT)+',
CAST(SUM(CASE WHEN t1.user_type = 'AP' THEN 1 ELSE 0 END) AS CHAR(50)), '(AP)+',
CAST(SUM(CASE WHEN t1.user_type = 'FT' THEN 1 ELSE 0 END) AS CHAR(50)), '(FT)')
AS count
FROM username t1
INNER JOIN
(
SELECT projectNo, process, proc_leader AS username
FROM proc_leader
UNION ALL
SELECT projectNo, process, proc_checker
FROM proc_checker
UNION ALL
SELECT projectNo, process, proc_staff
FROM proc_staff
) t2
ON t1.username = t2.username
GROUP BY t2.projectNo,
t2.process
演示在这里:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.