ANSWER :这是根据@Michael的回答构建的最终查询:
SELECT
Emp_ID,
MAX(CASE WHEN Skill_ID = 'WLN' THEN (Rating > 0) END) AS `WLN`,
MAX(CASE WHEN Skill_ID = 'LOC' THEN (Rating > 0) END) AS `LOC`,
MAX(CASE WHEN Skill_ID = 'BRV' THEN (Rating > 0) END) AS `BRV`,
AVG(CASE WHEN Skill_ID IN ('KWH','SIC','DOL') THEN (Rating) END) > 0 AS `KSD`
FROM Emp_Skill
WHERE Emp_ID IN (120,348,361,370)
GROUP BY Emp_ID
问题:
我有以下Emp_Skill
表:
Skill_ID* Emp_ID* Rating
--------------------------
WLN 120 6
WLN 348 5
WLN 361 7
WLN 370 8
LOC 120 7
LOC 370 7
LOC 348 7
BRV 120 3
LOC 361 6
BRV 348 1
KWH 348 5
KWH 120 5
KWH 361 5
KWH 370 5
SIC 361 8
SIC 348 4
SIC 120 2
DOL 348 5
DOL 361 8
我需要知道如果任意数量的员工对每项技能都有正面的技能等级。
所以,假设我想查看员工 120 , 348 , 361 和 370 的此信息
技能WLN
的查询1 是:
SELECT `Emp_ID`, `Rating` > 0 AS `WLN` FROM `Emp_Skill` WHERE `Skill_ID` = 'WLN' AND `Emp_ID` IN (120,348,361,370)
返回:
Emp_ID WLN
------------
120 1
348 1
361 1
370 1
技能LOC
的查询2 是:
SELECT `Emp_ID`, `Rating` > 0 AS `LOC` FROM `Emp_Skill` WHERE `Skill_ID` = 'LOC' AND `Emp_ID` IN (120,348,361,370)
返回:
Emp_ID LOC
------------
120 1
348 1
361 1
370 1
技能BRV
的查询3 是:
SELECT `Emp_ID`, `Rating` > 0 AS `BRV` FROM `Emp_Skill` WHERE `Skill_ID` = 'BRV' AND `Emp_ID` IN (120,348,361,370)
返回:
Emp_ID BRV
------------
120 1
348 1
技能KSD
的和查询4 是:
SELECT `Emp_ID`, AVG(`Rating`) > 0 AS `KSD` FROM `Emp_Skill` WHERE `Skill_ID` IN ('KWH','SIC','DOL') AND `Emp_ID` IN (120,348,361,370) GROUP BY `Emp_ID`
返回:
Emp_ID KSD
------------
120 1
348 1
361 1
370 1
问题是:如何有效地将这些查询合并到一个结果表中并将它们全部合并到一起,即:
Emp_ID WLN LOC BRV KSD
------------------------------
120 1 1 1 1
348 1 1 1 1
361 1 1 NULL? 1
370 1 1 NULL? 1
可能来自合并的SELECT
声明? ( NULL
值可以是返回结果集中评估为FALSE
的任何值)
OR :在性能方面,如果我只是逐个查询每个技能等级(使用上面的4个查询)会更好吗?
对不起,如果这对于那里的一些偷看是基本的,但我已经拉了很多头发,我仍然没有杀死这个。大声笑。提前谢谢。
答案 0 :(得分:1)
这是通过数据透视查询完成的,该查询相当于一堆CASE
语句。我认为这应该让你接近你需要的东西:
SELECT
Emp_ID,
MAX(CASE WHEN Skill_ID = 'WLN' THEN (Rating > 0) END) AS `WLN`,
MAX(CASE WHEN Skill_ID = 'LOC' THEN (Rating > 0) END) AS `LOC`,
MAX(CASE WHEN Skill_ID = 'BRV' THEN (Rating > 0) END) AS `BRV`,
AVG(CASE WHEN Skill_ID IN ('KWH','SIC','DOL') THEN (Rating > 0) END) AS `KSD`
FROM Emp_Skill
GROUP BY Emp_ID