【问题标题】:i need a mysql group by query to return hourly entry from a datetime column for each employee in a single row per employee我需要一个 mysql group by 查询来从每个员工的单行中的每个员工的日期时间列中返回每小时条目
【发布时间】:2018-06-28 00:16:25
【问题描述】:

我的mysql查询:

SELECT person,
IF((HOUR(datenew))= 9, COUNT(id),'') AS `9-10`,
IF((HOUR(datenew)) = 10, COUNT(id),'') AS `10-11`,
IF((HOUR(datenew)) = 11, COUNT(id),'') AS `11-12`,
IF((HOUR(datenew)) = 12, COUNT(id),'') AS `12-13`,
IF((HOUR(datenew)) = 13, COUNT(id),'') AS `13-14`,
IF((HOUR(datenew)) = 14, COUNT(id),'') AS `14-15`,
IF((HOUR(datenew)) = 15, COUNT(id),'') AS `15-16`,
IF((HOUR(datenew)) = 16, COUNT(id),'') AS `16-17`,
IF((HOUR(datenew)) = 17, COUNT(id),'') AS `17-18`,
IF((HOUR(datenew)) = 18, COUNT(id),'') AS `18-19`,
IF((HOUR(datenew)) = 19, COUNT(id),'') AS `19-20`,
IF((HOUR(datenew)) = 20, COUNT(id),'') AS `20-21`,
IF((HOUR(datenew)) = 21, COUNT(id),'') AS `21-22`,
COUNT(*) FROM mydatatable WHERE mydate = '2018-01-18' GROUP BY person,HOUR(datenew) 

我当前的查询输出:

我想要的输出:

我将使用 PHP 呈现报告。

【问题讨论】:

  • 我觉得您的问题出在 php 代码中 - 请发布您的循环 ;-)
  • 为什么不用php做一个简单的查询和准备组呢?
  • @Alex PHP 部分尚未编码 :-) 我们在这里讨论 mysql 查询...一旦我们获得所需的查询输出,那么它将使用 php 呈现
  • @olibiaz 我只需要渲染输出。需要通过mysql来获得更好的报告页面性能
  • 没有人需要这个。处理应用代码中数据显示的问题

标签: php mysql sql group-by


【解决方案1】:

您不需要GROUP BY ...,HOUR(datenew),只需person

http://sqlfiddle.com/#!9/b93760/1

SELECT person,
SUM(HOUR(datenew)=9) AS `9-10`,
SUM(HOUR(datenew)=10) AS `10-11`,
SUM(HOUR(datenew)=11)  AS `11-12`,
SUM(HOUR(datenew)=12)  AS `12-13`,
COUNT(*) 
FROM mydatatable 
WHERE mydate = '2018-01-18' 
GROUP BY person

【讨论】:

  • 谢谢....我也得到了 COUNT(CASE WHEN HOUR(datenew)= 9 THEN id END) AS 9-10
【解决方案2】:

使用派生表,应该是

select 
x.person,
sum(`9-10`) as `9-10`,
.
.
.
.
.
.
.
.
 from 
(
SELECT person,
IF((HOUR(datenew))= 9, COUNT(id),'') AS `9-10`,
IF((HOUR(datenew)) = 10, COUNT(id),'') AS `10-11`,
IF((HOUR(datenew)) = 11, COUNT(id),'') AS `11-12`,
IF((HOUR(datenew)) = 12, COUNT(id),'') AS `12-13`,
IF((HOUR(datenew)) = 13, COUNT(id),'') AS `13-14`,
IF((HOUR(datenew)) = 14, COUNT(id),'') AS `14-15`,
IF((HOUR(datenew)) = 15, COUNT(id),'') AS `15-16`,
IF((HOUR(datenew)) = 16, COUNT(id),'') AS `16-17`,
IF((HOUR(datenew)) = 17, COUNT(id),'') AS `17-18`,
IF((HOUR(datenew)) = 18, COUNT(id),'') AS `18-19`,
IF((HOUR(datenew)) = 19, COUNT(id),'') AS `19-20`,
IF((HOUR(datenew)) = 20, COUNT(id),'') AS `20-21`,
IF((HOUR(datenew)) = 21, COUNT(id),'') AS `21-22`,
COUNT(*) FROM mydatatable WHERE mydate = '2018-01-18' GROUP BY person,HOUR(datenew) 
) x

group by x.person

【讨论】:

    【解决方案3】:

    您可以使用(假)聚合函数,例如:min() 将行分组为一行

    SELECT person,
      min(IF((HOUR(datenew))= 9, COUNT(id),'')) AS `9-10`,
      min(IF((HOUR(datenew)) = 10, COUNT(id),'')) AS `10-11`,
      min(IF((HOUR(datenew)) = 11, COUNT(id),'')) AS `11-12`,
      min(IF((HOUR(datenew)) = 12, COUNT(id),'')) AS `12-13`,
      min(IF((HOUR(datenew)) = 13, COUNT(id),'')) AS `13-14`,
      min(IF((HOUR(datenew)) = 14, COUNT(id),'')) AS `14-15`,
      min(IF((HOUR(datenew)) = 15, COUNT(id),'')) AS `15-16`,
      min(IF((HOUR(datenew)) = 16, COUNT(id),'')) AS `16-17`,
      min(IF((HOUR(datenew)) = 17, COUNT(id),'')) AS `17-18`,
      min(IF((HOUR(datenew)) = 18, COUNT(id),'')) AS `18-19`,
      min(IF((HOUR(datenew)) = 19, COUNT(id),'')) AS `19-20`,
      min(IF((HOUR(datenew)) = 20, COUNT(id),'')) AS `20-21`,
      min(IF((HOUR(datenew)) = 21, COUNT(id),'')) AS `21-22`,
    COUNT(*) FROM mydatatable 
    WHERE mydate = '2018-01-18' 
    GROUP BY person
    

    【讨论】:

    • 错误码:1111 组函数使用无效
    猜你喜欢
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2021-10-19
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2021-12-29
    相关资源
    最近更新 更多