【问题标题】:ruby on rails group by with null values problemruby on rails group by 空值问题
【发布时间】:2011-02-28 23:11:58
【问题描述】:

我有一个小时表,用于存储用户时间跟踪信息, 该表格由以下单元格组成

project_id
task_id (optional can be null)
worker_id
reported_date
working_hours

每个工作人员每天输入几条记录,因此表格通常如下所示

id project_id  worker_id task_id   reported_date  working hours;    
== =========== ========= ========= =============  ==============
1  1           1         1         10/10/2011      4                 
2  1           1         1         10/10/2011     14                 
3  1           1                   10/10/2011      4                 
4  1           1                   10/10/2011     14                 

task_id 不是必填字段,因此有时用户不会选择它 他们的 task_id 单元格是空的
现在我需要使用 group by 子句来显示数据
所以结果会是这样的:

project_id worker_id task_id   working hours
========== ========= ========= ==============
1          1         1         18                 
1          1                   18            

我按条件做了以下分组:

@group_hours = Hour.group('project_id,worker_id,task_id)').
      select('project_id, task_id ,worker_id,sum(working_hours) as 
         working_hours_sum')

我的视图是这样的

<% @group_hours.each do |b| %>
     <tr>
       <td><%= b.project.name if b.project %></td>
        <td><%= b.worker.First_name if b.worker %></td>
        <td><%= b.task.name if b.task %></td>
        <td class="center"><%= b.working_hours_sum %></td>
       <td></td>
     </tr>
<% end %>

这是有效的但只有当 task_id 不为 null 时,当任务 id 为 null 时,它会显示所有记录而不像这样对它们进行分组

project_id  worker_id task_id   working hours
=========== ========= ========= ==============
1           1         1         18                 
1           1                    4            
1           1                   14    

我会很感激这个问题的任何解决方案

【问题讨论】:

  • 老兄,什么样的格式(?)那?!
  • 只是带有许多   的纯文本
  • 大声笑,我知道。看看我做了多少清洁? (从您的原稿中删除了 3000 多个字符!)

标签: ruby-on-rails ruby activerecord


【解决方案1】:

假设您使用的是 mysql,您可以使用 COALESCE 函数来处理空值,方法是将空值更改为其他值

例如

select COALESCE(colname,0) from table where COALESCE(colname,0) > 1;

IFNULL() 是另一种选择

【讨论】:

  • COALESCE 是此类事情的标准 SQL 函数。 AFAIK,IFNULL 是 MySQL 主义,NVL 是 Oracle 版本,但现在它们都支持 COALESCE
  • 是的,我以为 COALESCE 无处不在,但不想肯定地说,但实际上它似乎无处不在,甚至是 sqlite
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多