如何进行 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(),然后按 ID
、Name
和 State
.
进行 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;
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;
我认为这应该可以解决您的问题。
我有一个 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(),然后按 ID
、Name
和 State
.
这将汇总您试图避免的 '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;
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;
我认为这应该可以解决您的问题。