繁体   English   中英

计算查询表中的行数

[英]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

演示在这里:

SQLFiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM