如何使SQL查询通过ID添加计算值组?

时间:2019-04-18 03:39:36

标签: mysql sql laravel sum laravel-query-builder

我有一张桌子,上面有名字,negeri以及开始服务和结束服务的年份。我想获得一个人在某州服务的年限:

  ID | Name     | State   |   yearstart     |    yearend
  -----------------------------------------------------------
  1  | Tom      | Kedah   |      2001       |      2002
  1  | Tom      | Kedah   |      2003       |      2007
  2  | Anne     | Melaka  |      2008       |      2012
  2  | Anne     | Melaka  |      2013       |      2018
  3  | Bill     | KL      |      2000       |      2001

我已经尝试过了。但是它只计算年数并列出所有人(姓名和州名重复)。

   $query = DB::table('itemregistrations')
                ->join('state', 'itemregistrations.StateID', '=', 'state.StateID')
                ->select('itemregistrations.name');

  if($request->input('negeri_perkhidmatan') != '') {
            $query->join('itemregistrationpangkat', 'itemregistrationpangkat.itemRegistrationID', '=', 'itemregistrations.itemRegistrationID')
                ->where('itemregistrationpangkat.StateID', $request->input('negeri_perkhidmatan'));           
        }

  if(request('tempoh_negeri')) {
            $query->whereRaw('yearend - yearstart >= ?', [request('tempoh_negeri')]);  
        }

结果显示:

  ID | Name     | State   |    years   
  ---------------------------------------
  1  | Tom      | Kedah   |      1      
  1  | Tom      | Kedah   |      4     
  2  | Anne     | Melaka  |      4       
  2  | Anne     | Melaka  |      5      
  3  | Bill     | KL      |      1     

结果应为:

  ID | Name     | State   |    years   
  ---------------------------------------
  1  | Tom      | Kedah   |      5      
  2  | Anne     | Melaka  |      9            
  3  | Bill     | KL      |      1 

使用ajax获取浏览器中显示的结果。我没有把它放在这里。

6 个答案:

答案 0 :(得分:1)

这将起作用:

select m.id,m.name,sum(m.duration) from (select ID,Name,yearend-yearstart 
                      as duration from Table1)m group by  m.id,m.name;

检查 :http://sqlfiddle.com/#!9/9029438/4

答案 1 :(得分:0)

试试看!
从表组中按ID选择ID,名称,状态,总和(年)

答案 2 :(得分:0)

years列上尝试SUM(),然后在IDNameState上按GROUP BY。

这将汇总您要避免的“重复”行。

答案 3 :(得分:0)

您必须使用Group By ID和这样的年差总和,由于表的数量过多,我没有运行此代码,但是您可以轻松理解。

$query = DB::table('itemregistrations')
            ->join('state', 'itemregistrations.StateID', '=', 'state.StateID');

if($request->input('negeri_perkhidmatan') != '') {
    $query = $query->join('itemregistrationpangkat', 'itemregistrationpangkat.itemRegistrationID', '=', 'itemregistrations.itemRegistrationID')
            ->where('itemregistrationpangkat.StateID', $request->input('negeri_perkhidmatan'));           
}

if(request('tempoh_negeri')) {
    $query = $query->whereRaw('yearend - yearstart >= ?', [request('tempoh_negeri')]);  
}

$results = $query->select(DB::raw('itemregistrations.ID, itemregistrations.name, SUM(yearend - yearstart) as years'))
                 ->groupBy('itemregistrations.ID')
                 ->get();  

答案 4 :(得分:0)

select name, state (max(yearend) - min(yearstart)) as years from state group by name;


+------+--------+------+
| name | state  | years |
+------+--------+------+
| Anne | Melaka |   10 |
| Bill | KL     |    1 |
| Tom  | Kedah  |    6 |
+------+--------+------+

答案 5 :(得分:0)

通过m.userid,m.state,m.name从mytable m组中选择m.userid,m.name,m.state,SUM(m.yearend-m.yearstart)作为持续时间;

我认为这应该可以解决您的问题。