我认为这就是你要找的:
SELECT
t4.Name,
SUM(CASE WHEN t1.type = 'PROJECT' THEN 1 ELSE 0 END) * 100 / COUNT(t1.type) Project,
SUM(CASE WHEN t1.type = 'SUPPORT' THEN 1 ELSE 0 END) * 100 / COUNT(t1.type) SUPPORT,
SUM(CASE WHEN t1.type = 'EDUCATION' THEN 1 ELSE 0 END) * 100 / COUNT(t1.type) Education
FROM T1
INNER JOIN T2 ON t1.ID = t2.T1ID
INNER JOIN t5 ON t2.task = t5.task
INNER JOIN t3 ON t3.id = t5.t3id
INNER JOIN t4 ON t3.Id = t4.t3id
GROUP BY t4.Name;
这会给你:
| NAME | PROJECT | SUPPORT | EDUCATION |
----------------------------------------------
| Bob Marley | 60 | 40 | 0 |
| Tom Cruise | 100 | 0 | 0 |
对于您发布的示例数据。
请注意:这只会为您Name提供项目和任务中涉及的内容。您可能需要OUTER JOIN(LEFT or RIGHT)在表中而不是INNER JOIN包含那些Name未参与任何任务或项目的 s(不匹配的行),用IFNULL()to 替换NULLs 为零。
更新:
您可以使用该CONCAT()函数来执行此操作,但如果您将先前的查询包含在子查询中并在外部查询中执行此操作,则会更容易和更易读,如下所示:
SELECT
Name,
CONCAT(CAST(project AS DECIMAL(10, 2)), ' AND ',
CAST(support AS DECIMAL(10, 2)), ' AND ',
CAST(education AS DECIMAL(10, 2))) AS Percentage
FROM
(
SELECT
t4.Name,
SUM(CASE WHEN t1.type = 'PROJECT' THEN 1 ELSE 0 END) * 100 / COUNT(t1.type) Project,
SUM(CASE WHEN t1.type = 'SUPPORT' THEN 1 ELSE 0 END) * 100 / COUNT(t1.type) SUPPORT,
SUM(CASE WHEN t1.type = 'EDUCATION' THEN 1 ELSE 0 END) * 100 / COUNT(t1.type) Education
FROM T1
INNER JOIN T2 ON t1.ID = t2.T1ID
INNER JOIN t5 ON t2.task = t5.task
INNER JOIN t3 ON t3.id = t5.t3id
INNER JOIN t4 ON t3.Id = t4.t3id
GROUP BY t4.Name
) t;
这会给你:
| NAME | PERCENTAGE |
-----------------------------------------
| Bob Marley | 60.00 AND 40.00 AND 0.00 |
| Tom Cruise | 100.00 AND 0.00 AND 0.00 |
您可以添加WHERE子句以将此值限制为仅WHERE Name = 'Some name'在外部查询或子查询中的任何用户名。
更新 2
好的,对不起,我错过了。不需要PIVOTorCONCAT()或动态 SQL 来执行此操作。你可以这样做:
SELECT
t1.type,
COUNT(t2.task) * 100 /
(SELECT COUNT(*)
FROM T4 t
WHERE t4.Name = t.Name) AS Percentage
FROM T1
INNER JOIN T2 ON t1.ID = t2.T1ID
INNER JOIN t5 ON t2.task = t5.task
INNER JOIN t3 ON t3.id = t5.t3id
INNER JOIN t4 ON t3.Id = t4.t3id
WHERE t4.Name = 'Bob Marley'
GROUP BY t4.Name, t1.type;
这会给你:
| TYPE | PERCENTAGE |
------------------------
| PROJECT | 60 |
| SUPPORT | 40 |