【问题标题】:SQL select same column multiple times with different conditionsSQL以不同的条件多次选择同一列
【发布时间】:2019-06-26 03:59:25
【问题描述】:

我正在尝试显示几个分支机构及其对应的经理姓名、主管人数以及男性和女性员工的人数。但是,当我执行查询时会弹出以下错误消息,“列 'STAFF_T.stf_first_name' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。”请帮帮我:)

SELECT  b.brc_id AS 'Branch ID',
        s.stf_first_name AS 'Manager First Name',
        s.stf_last_name AS 'Manager Last Name',
        (SELECT COUNT (sa.stf_position) FROM STAFF_T sa
         WHERE (sa.stf_position = 'Supervisor')) AS 'Number of Supervisor',
         (SELECT COUNT (sb.stf_position) FROM STAFF_T sb
          WHERE (sb.stf_position = 'Staff') AND
         (sb.stf_gender = 'Male')) AS 'Male Staff',
         (SELECT COUNT (sc.stf_position) FROM STAFF_T sc
          WHERE (sc.stf_position = 'Staff') AND
         (sc.stf_gender = 'Female')) AS 'Female Staff'
FROM BRANCH_T b, STAFF_T s
WHERE (b.brc_id = s.stf_brc_id) AND (b.brc_manager = s.stf_id)
GROUP BY b.brc_id

This is my current output 它目前显示主管、男性员工和女性员工的总数。它应该根据每个分支 id 显示主管和员工的数量。

【问题讨论】:

  • 错误信息是不言自明的。该组的哪一行应该用于该值?分组时,如果未在GROUP BY 中列出,则该列只能与作用于整个组的聚合函数一起使用。
  • 你能放一个预期输出的样本吗?
  • 错误说明了一切,您需要在GROUP BY 子句中包含列 s.stf_first_name,s.stf_last_name
  • 试过了,还是不行>_
  • @Unknown66 MJoy 给了你答案。如果您尝试过但仍然无效,请编辑您的问题以显示新代码。

标签: sql


【解决方案1】:

下面的查询应该可以工作,

SELECT 
    b.brc_id AS [Branch ID]
    ,s.stf_first_name AS [Manager First Name]
    ,s.stf_last_name AS [Manager Last Name]
    ,COUNT(CASE WHEN s.stf_position = 'Supervisor' THEN 1 ELSE 0 END) AS [Number of Supervisor]
    ,COUNT(CASE WHEN s.stf_position = 'Staff' AND s.stf_gender = 'Male' THEN 1 ELSE 0 END) AS [Male Staff]
    ,COUNT(CASE WHEN s.stf_position = 'Staff' AND s.stf_gender = 'Female' THEN 1 ELSE 0 END) AS [Female Staff]
FROM BRANCH_T b
INNER JOIN STAFF_T s 
    ON b.brc_id = s.stf_brc_id AND b.brc_manager = s.stf_id
GROUP BY b.brc_id,s.stf_first_name,s.stf_last_name

【讨论】:

    【解决方案2】:

    如错误消息所述,您正在混合聚合查询和非聚合查询。我会查询分支表并将其连接两次 - 一次在员工表上获取经理的详细信息,一次在员工表的聚合查询中获取计数:

    SELECT b.brc_id AS 'Branch ID',
           m.stf_first_name AS 'Manager First Name',
           m.stf_last_name AS 'Manager Last Name',
           c.supervisor_count,
           c.male_staff,
           c.female_staff
    FROM   branch_t b
    JOIN   staff_t m ON b.brc_manager = m.stf_id
    JOIN   (SELECT     stf_brc_id, 
                       COUNT(CASE sa.stf_position WHEN 'Supervisor' THEN 1 END)
                             AS supervisor_count,
                       COUNT(CASE WHEN sb.stf_position = 'Staff' AND
                                       sb.stf_gender = 'Male' THEN 1 END) AS male_staff, 
                       COUNT(CASE WHEN sb.stf_position = 'Staff' AND
                                       sb.stf_gender = 'Female' THEN 1 END) AS female_staff
            FROM     staff
            GROUP BY stf_brc_id) c ON c.stf_brc_id = b.brc_id
    

    【讨论】:

      【解决方案3】:

      使用 RIGHT JOIN 可以使您的查询变得简单,如下所示-

      SELECT  S.stf_brc_id,
      MAX(CASE WHEN B.brc_id IS NULL THEN NULL ELSE S.stf_first_name END) F_name,
      MAX(CASE WHEN B.brc_id IS NULL THEN NULL ELSE S.stf_last_name END) L_name,
      SUM(CASE WHEN S.stf_position = 'Supervisor' THEN 1 ELSE 0 END ) 'Number of Supervisor',
      SUM(CASE WHEN S.stf_position = 'Staff' AND S.stf_gender = 'Male' THEN 1 ELSE 0 END ) 'Male Staff',
      SUM(CASE WHEN S.stf_position = 'Staff' AND S.stf_gender = 'Female' THEN 1 ELSE 0 END ) 'Female Staff'
      FROM BRANCH_T B 
      RIGHT JOIN STAFF_T S ON  B.brc_id = S.stf_brc_id AND B.brc_manager = S.stf_id
      GROUP BY  S.stf_brc_id
      

      【讨论】:

        猜你喜欢
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 2017-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多