Как сделать SQL-запрос для добавления вычисляемых значений группы по идентификатору? - PullRequest
3 голосов
/ 18 апреля 2019

У меня была таблица с именем, 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 ]

2 голосов
/ 18 апреля 2019

это будет работать:

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 голос
/ 18 апреля 2019
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;

Я думаю, что это должно решить вашу проблему.

0 голосов
/ 18 апреля 2019
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 |
+------+--------+------+
0 голосов
/ 18 апреля 2019

Вы должны использовать идентификатор группы по идентификатору и сумму разницы в годах, как этот, я не запускал этот код из-за большого количества таблиц, но вы можете легко понять.

$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();  
0 голосов
/ 18 апреля 2019

Попробуйте SUM () для столбца years, затем GROUP BY на ID, Name и State.

Это объединит «дублированные» строки, которых вы пытаетесь избежать.

0 голосов
/ 18 апреля 2019

Попробуйте это!
выберите идентификатор, имя, штат, сумму (годы) лет из группы таблиц по идентификатору

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...