首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择具有不同条件的两个和MySQL

选择具有不同条件的两个和MySQL
EN

Stack Overflow用户
提问于 2019-03-13 03:08:32
回答 3查看 73关注 0票数 0

我有一个数据库表“条目”与员工的时间日志。

代码语言:javascript
复制
employee_id    |    hours    |    task_id    |    logged_at
---------------------------------------------------------------------
1              |    .5       |    1          |    1546342200 (jan 19)
2              |    .8       |    2          |    1547548200 (jan 19)
1              |    .2       |    3          |    1549022400 (feb 19)
1              |    .5       |    3          |    1549022400 (feb 19)
2              |    .9       |    1          |    1551625200 (mar 19)

我的目标是拉出一份报告,列出一年中每个月的计费和非计费小时数。可计费还是不可计费由任务ID决定。我有一个可计费的任务ID列表和一个非可计费的任务ID列表。

最终结果的目标

代码语言:javascript
复制
month    |    year    |    total   |    billable    |    nonbillable
-------------------------------------------------------------------
1        |    2019    |    1.3     |    .8          |    .5
2        |    2019    |    .7      |    .7          |    0
3        |    2019    |    .9      |    0           |    .9

这是基于任务2和3是可计费的,而任务1是不可计费的。

请注意,这是真实数据库的简化,它有大约25个不同的任务ID,偶尔会发生变化。

我能够得到大体的想法,但被困在基于task_id的计费小时和非计费小时的划分上。

这就是我所得到的:

代码语言:javascript
复制
SELECT 
  MONTH(FROM_UNIXTIME(logged_at)), 
  YEAR(FROM_UNIXTIME(logged_at)), 
  SUM(hours)
FROM dpd_harvest_entries
GROUP BY 
  MONTH(FROM_UNIXTIME(logged_at)), 
  YEAR(FROM_UNIXTIME(logged_at))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-13 03:13:05

我假设您有一个包含列billabletasks表,其中1代表可计费任务,0代表非计费任务。那么您的查询可能如下所示:

代码语言:javascript
复制
SELECT 
  MONTH(FROM_UNIXTIME(logged_at)), 
  YEAR(FROM_UNIXTIME(logged_at)),
  SUM(hours) total,
  SUM(IF(t.billable,hours,0)) billable,
  SUM(IF(t.billable,0,hours)) nonbillable
FROM dpd_harvest_entries e
INNER JOIN tasks t
ON e.task_id = t.task_id
GROUP BY 
  MONTH(FROM_UNIXTIME(logged_at)), 
  YEAR(FROM_UNIXTIME(logged_at))

如果您只使用逗号分隔ids,则可以将此查询转换为:

代码语言:javascript
复制
SELECT 
  MONTH(FROM_UNIXTIME(logged_at)), 
  YEAR(FROM_UNIXTIME(logged_at)),
  SUM(hours) total,
  SUM(IF(task_id IN ({your id list}),hours,0)) billable,
  SUM(IF(task_id IN ({your id list}),0,hours)) nonbillable
FROM dpd_harvest_entries e
GROUP BY 
  MONTH(FROM_UNIXTIME(logged_at)), 
  YEAR(FROM_UNIXTIME(logged_at))

其中{your id list}应替换为ex:IN (1, 4, 55, 47)

为了将来的使用,我强烈建议使用ALTER TABLE dpd_harvest_entries MODIFY logged_at DATETIME,它将简化许多查询,并允许在任何地方消除FROM_UNIXTIME调用。

票数 0
EN

Stack Overflow用户

发布于 2019-03-13 03:24:08

这应该行得通..

代码语言:javascript
复制
select a.month, a.year, (billable + non_billable) total, billable, non_billable
from (select month, year, sum(hours) billable
      from dpd_harvest_entries
      where task_id in (2, 3)
      group by month, year) a,
     (select month, year, sum(hours) non_billable
      from dpd_harvest_entries
      where task_id in (1))
      group by month, year) b
where a.month = b.month
and a.year = b.year

我假设您可以将时间戳转换为月和年

票数 0
EN

Stack Overflow用户

发布于 2019-03-13 03:38:00

您需要两个子查询(可计费和不可计费),在这两个查询中都有一个年-月列,然后在您的年-月列中将它们连接在一起,如下所示:

代码语言:javascript
复制
SELECT 
billable.year_month as year_month,
billable.sum_hours as billable_hours,
non_billable.sum_hours as non_billable_hours,
(billable.sum_hours + non_billable.sum_hours) as total_hours

FROM (SELECT 
DATE_FORMAT(FROM_UNIXTIME(logged_at), '%Y-%m') as year_month,
SUM(hours) as sum_hours
FROM dpd_harvest_entries
WHERE task_id IN (1,2,3)
GROUP BY
1) as billable,

(SELECT 
DATE_FORMAT(FROM_UNIXTIME(logged_at), '%Y-%m') as year_month,
SUM(hours) as sum_hours
FROM dpd_harvest_entries
WHERE task_id IN (4,5,6)
GROUP BY
1) as non_billable

LEFT JOIN billable on billable.year_month = non_billable.year_month

注意这里的联接类型;如果在一个月内没有计费或非计费小时数,这将跳过几个月。不确定在您的情况下需要哪种联接类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55129043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档