【问题标题】:Show average hours in specific periods using SQL使用 SQL 显示特定时期的平均小时数
【发布时间】:2017-10-11 21:54:47
【问题描述】:

我正在尝试显示 3 个时段的平均休假天数和病假天数。

到目前为止,我有这个 SQL 查询:

SELECT AVG(VACATIONHOURS) AS 'Vacation hours', AVG(SICKLEAVEHOURS) AS 'SICK DAYS'
FROM HUMANRESOURCES.EMPLOYEE E
WHERE E.BIRTHDATE BETWEEN '01-01-1960' AND '12-31-1969'
UNION ALL
SELECT AVG(VACATIONHOURS) AS 'VACATION', AVG(SICKLEAVEHOURS) AS 'SICK DAYS'
FROM HUMANRESOURCES.EMPLOYEE E
WHERE E.BIRTHDATE BETWEEN '01-01-1970' AND '12-31-1979'
UNION ALL
SELECT AVG(VACATIONHOURS) AS 'VACATION', AVG(SICKLEAVEHOURS) AS 'SICK DAYS'
FROM HUMANRESOURCES.EMPLOYEE E
WHERE E.BIRTHDATE BETWEEN '01-01-1980' AND '12-31-1989'
;

我的输出只有 2 列病假和假期,下面 3 行带有数字。

我的问题是如何添加显示年份的第三列?

报告生成器需要它,所以我可以正确地表示该信息

【问题讨论】:

  • 年是什么意思?你想在第一行写 1960 到 1969 等等吗?
  • 我需要添加第三列,表明从 1960 年到 1969 年选择了 45 和 42 个数字

标签: mysql sql reportbuilder3.0 report-builder2.0


【解决方案1】:

我希望您希望在 where 子句中添加年份,然后添加 max(years)

SELECT AVG(VACATIONHOURS) AS 'Vacation hours', 
       AVG(SICKLEAVEHOURS) AS 'SICK DAYS', 
       max('1960 to 1969')
 FROM HUMANRESOURCES.EMPLOYEE E
WHERE E.BIRTHDATE BETWEEN '01-01-1960' AND '12-31-1969'

【讨论】:

  • 这正是我想要的。我只是不明白'max'方法是如何工作的?
  • 如果你只使用 '1960 to 1969' 你会得到一个错误,指出不是按功能分组。因此,如果您使用 max 或 min 之类的聚合函数,则无需添加 group by。在这种情况下,Max(some string) 和 some string 相同
  • 我明白了,有道理。谢谢
【解决方案2】:

我建议您将它们分组。我会这样做:

SELECT CONCAT(YEAR(BIRTHDATE), 's') as decade,
       AVG(VACATIONHOURS) AS `Vacation hours`,
       AVG(SICKLEAVEHOURS) AS `SICK DAYS`
FROM HUMANRESOURCES.EMPLOYEE E
GROUP BY decade
ORDER BY decade;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-18
    • 2012-05-06
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多