【问题标题】:Combine multiple queries against one table into multiple fields of one result set将针对一张表的多个查询组合成一个结果集的多个字段
【发布时间】:2012-06-07 02:34:39
【问题描述】:

回答:这是根据@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

而且我需要知道是否有任意数量的员工对每项技能都有积极的技能评分

假设我想查看员工 120348361370 的此信息.

查询 1 技能 WLN 是:

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

查询 2 技能 LOC 是:

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

查询 3 技能 BRV 是:

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

查询 4 技能 KSD 是:

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

对不起,如果这对于一些偷窥者来说是基本的,但我已经拉了很多头发,但我还没有杀死它。哈哈。提前致谢。

【问题讨论】:

    标签: mysql sql field multiple-records


    【解决方案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
    

    【讨论】:

    • 感谢@Michael 然而,只有'WLN' 给了我结果。其他字段 'LOC''BRV''KSD' 都返回 NULL.. 嗯.. 知道为什么吗?
    • 甜蜜!做到了! (介意解释原因吗?)最后但非常重要的一件事是,Query 4AVG,但是当我在您对 MAX(CASE WHEN Skill_ID IN ('KWH','SIC','DOL') THEN (AVG(Rating) > 0) END) AS KSD 的回答中更改第 4 种情况时,它会显示“#1111 - 无效使用组功能”,当我取出 MAX() 时它会消失,但 KSD 列再次给出 NULL .. 帮助.. :D
    • 嘘,是的!我将其更改为 AVG(CASE WHEN Skill_ID IN ('KWH','SIC','DOL') THEN (Rating > 0) END) AS KSD 并且有效!我做对了吗?所以我可以将您的答案标记为已接受,伙计。你的史诗。
    • @AnaBan MAX() 起作用是因为GROUP BY 有效地抓取了任何Emp_ID 的第一行,因为其他列不包含在组中。通过使用MAX() 而不是每组的第一行,它会选择每组的最高值来消除空值。抱歉,我没有注意到最后一个查询的不同之处。您在此处使用 AVG() 聚合是正确的。我也会在上面编辑。
    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多