如何进行 sql 查询以按 id 分组添加计算值?

How to make sql query for adding calculated values group by id?

我有一个 table,其中包含姓名、姓名和开始服役和结束的年份 service.I 想要获得一个人在某个州服役的年数:

  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 获取的。我就不放了。

试试这个!
select id,name,state,sum(years) 从 table 开始按 ID 分组

years 列上尝试 SUM(),然后按 IDNameState.

进行 GROUP BY

这将汇总您试图避免的 'duplicated' 行。

这会起作用:

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

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 |
+------+--------+------+
SELECT 
    m.userid,
    m.name,
    m.state,
    SUM(m.yearend - m.yearstart) AS duration
FROM
    mytable m
GROUP BY m.userid , m.state , m.name;

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