gpt4 book ai didi

MySQL - 动态数据透视表分组问题

转载 作者:行者123 更新时间:2023-11-28 23:28:37 26 4
gpt4 key购买 nike

我正在尝试使用 MySQL 准备语句创建一个动态数据透视表,我从许多其他关于 MySQL 数据透视表的问题中收集了这些语句。但我没有得到预期的输出。

我的表格是这样的:

skills 包含员工可以接受培训的所有“技能”

| id | skill   | expiry_date |
----+---------+-------------
| 1 | SkillA | 2016-07-01 |
| 2 | SkillB | 2016-06-01 |
| 3 | SkillC | 2016-04-01 |

employee_skills 包含员工接受技能培训的日期日志

| id | employee_id | skill_id | date_trained |
----+-------------+----------+--------------
| 1 | 1000001 | 1 | 2016-05-01 |
| 2 | 1000002 | 1 | 2016-05-02 |
| 3 | 1000001 | 2 | 2016-05-03 |
| 4 | 1000002 | 3 | 2016-05-04 |

campaign_skills 包含已分配给“事件”的技能。

| id | campaign_id | skill_id |
----+-------------+----------
| 1 | 1001 | 1 |
| 2 | 1001 | 3 |
| 3 | 1002 | 2 |

我还有一个包含员工详细信息( first_namelast_name 等)的表格,其中包含 employee_id作为主键。


期望的结果

这是我需要在我的 View 中显示的内容:

| Employee    | SkillA     | SkillB      | SkillC      |
-------------+------------+-------------+-------------
| Person One | 2016-05-01 | 2016-05-03 | - |
| Person Two | 2016-05-02 | - | 2016-05-04 |

显示的日期应该是最近的 employee_skills.date_trained .

我还需要能够标记日期 if ( employee_skills.date_trained < skills.expiry_date ) .但我可以稍后解决这个问题。


我的查询

我编写了一个将 campaign_id 作为参数的存储过程。我想我快到了,但我没有得到我期待的结果......

SET @sql = NULL;

SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'CASE WHEN skill = ''',
s.skill,
''' THEN es.date_trained ELSE 0 END AS ',
s.skill
)
) INTO @sql
FROM skills s
JOIN campaign_skills cs ON cs.skill_id = s.id
WHERE cs.campaign_id = campaignID;

SET @sql = CONCAT('

SELECT CONCAT(e.first_name, " ", e.last_name) AS employee, ', @sql, '
FROM employees e
LEFT JOIN employee_skills es ON es.employee_id = e.id
LEFT JOIN campaign_skills cs ON cs.skill_id = es.skill_id
LEFT JOIN skills s ON s.id = es.skill_id

WHERE e.id IN (SELECT id FROM employees WHERE campaign_id = campaignID)
AND e.active = 1

ORDER BY es.id DESC
GROUP BY e.id, s.id

');

PREPARE statement FROM @sql;
EXECUTE statement;
DEALLOCATE PREPARE statement;

这将输出如下内容:

| employee   | SkillA     | SkillB     |
------------+------------+------------
| Person One | 2015-05-04 | - |
| Person One | - | 2016-05-01 |
| Person Two | - | 2016-03-25 |
| Person Two | 2016-04-04 | - |

即使我使用的是 GROUP .我已经坚持了一段时间,也许有人可以告诉我我的错误?

SQL FIDDLE:http://sqlfiddle.com/#!9/7caa6c/1

最佳答案

以下 SQL 可以作为解决问题的起点:

SELECT
es.employee_id,
CONCAT(e.first_name, " ", e.last_name) AS employee,
MAX(IF (es.skill_id = 1, es.date_trained, null)) AS '1',
MAX(IF (es.skill_id = 2, es.date_trained, null)) AS '2',
MAX(IF (es.skill_id = 3, es.date_trained, null)) AS '3'
FROM
employee_skills es
LEFT JOIN employees e ON es.employee_id = e.id
GROUP BY
es.employee_id

结果是这样的数据透视表:

| employee_id | employee   | 1          | 2          | 3          |
+-------------+------------+------------+------------+------------+
| 1001675 | Person Two | (null) | 2016-07-02 | 2016-07-04 |
| 1006111 | Person One | 2016-07-01 | 2016-07-11 | (null) |

如果 SQL 是动态创建的,技能 ID 可以替换为技能名称。之后也可以替换 ID。

关于MySQL - 动态数据透视表分组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38218685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com