将针对一个表的多个查询组合到一个结果集的多个字段中

时间:2012-06-07 02:34:39

标签: mysql sql field multiple-records

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个查询)会更好吗?

对不起,如果这对于那里的一些偷看是基本的,但我已经拉了很多头发,我仍然没有杀死这个。大声笑。提前谢谢。

1 个答案:

答案 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