【问题标题】:Writting SQL code with using count and gorup_concat使用 count 和 group_concat 编写 SQL 代码
【发布时间】:2016-07-16 21:52:54
【问题描述】:

我已经阅读了每个标题相似的帖子,但没有找到正确的答案。
我真正需要做的是从 MySQL 表中计算一些数据,然后执行 group_concat,因为我得到了不止一行。
我的桌子是这样的

这是我尝试运行查询的方式

SELECT 
    count(cal.day) * 8,
    w.name
    FROM claim as c 
    RIGHT JOIN calendar as cal ON c.id = cal.claim_id
    RIGHT JOIN worker as w ON c.worker_id = w.id
    GROUP BY c.id
    ORDER BY w.name asc

但是我为一些工人获得了不止一排,由于 count(),我无法对他们进行 group_concat。我需要这个用于我制作的mysql程序,所以如果可以的话请帮助我。
我希望我已经给了你足够的信息

为迪伦编辑:

查看输出的差异
按 w.id 分组

按 c.id 分组

【问题讨论】:

  • 删除sql-server标签
  • 为什么是GROUP BY c.id,而不是GROUP BY w.id
  • @DylanSu 看到编辑的差异一位用户有几个月或一个月。
  • GROUP BY w.id 的结果似乎更合理。
  • 想要的结果是什么?用简单的英语,目标是什么?

标签: mysql count procedure group-concat


【解决方案1】:

MySQL 不允许两个聚合函数一起使用,例如GROUP_CONCAT(COUNT(...))

因此,我们可以使用sub-query 来解决如下问题。

SELECT
    GROUP_CONCAT(t.cnt_cal_day) as cnt_days,
    t.name
FROM
( 
    SELECT 
        count(cal.day) * 8 as cnt_cal_day,
        w.name
    FROM claim as c 
    RIGHT JOIN calendar as cal ON c.id = cal.claim_id
    RIGHT JOIN worker as w ON c.worker_id = w.id
    GROUP BY c.id
    ORDER BY w.name asc
) t

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案2】:

虽然我还不清楚这个问题,但我试着猜测你需要什么。

这个查询:

SELECT 
    w.name,
    COUNT(cal.day) * 8 AS nb_hours
FROM worker w
  LEFT JOIN claim c ON w.id = c.worker_id
  INNER JOIN calendar cal ON c.id = cal.claim_id
GROUP BY w.id
ORDER BY w.name ASC

返回所有工人的姓名,以及为每个工人批准的假期小时数。

如果您改用LEFT JOIN calendar,您将获得每位员工申请的假期小时数(已批准和未批准)。为了将它们分开,您应该像这样进行查询:

SELECT 
    w.name,
    c.approved,           # <---- I assumed the name of this field
    COUNT(cal.day) * 8 AS nb_hours
FROM worker w
  LEFT JOIN claim c ON w.id = c.worker_id
  LEFT JOIN calendar cal ON c.id = cal.claim_id
GROUP BY w.id, c.approved
ORDER BY w.name ASC

此查询应为每个工作人员返回 1 或 2 行,具体取决于他们拥有的休假申请类型(无、仅批准、仅未批准、两者都有)。对于没有任何休假申请的工人,查询在approved 列中返回NULL,在nb_hours 列中返回0

【讨论】:

    猜你喜欢
    • 2013-07-02
    • 2021-10-30
    • 1970-01-01
    • 2019-04-12
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2022-09-18
    相关资源
    最近更新 更多