Group_Concat несколько столбцов в sql - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть две таблицы.

Первая таблица называется Employee

  |EID| EName|  Salary |
=========================
  |1  |A     |300      |
  |2  |B     |400      | 
  |3  |O     |500      |

Вторая таблица называется Employee_Sal_Changes

  |EID|  Salary_Change_History| year
=======================================
  |1  |100                    |2012
  |1  |200                    |2013
  |1  |300                    |2014
  |2  |200                    |2013 
  |2  |400                    |2014 
  |3  |100                    |2011
  |3  |200                    |2012
  |3  |300                    |2013
  |3  |500                    |2014

В моей передней таблице я хотел бы показать

 id   |Salary Change History    |
=================================
 A    | 100:2012                |
      | 200:2013                |
      | 300:2014                |
=================================
 B    | 200:2013                |
      | 400:2014                |
=================================
 O    | 100:2011                |
      | 200:2012                |
      | 300:2013                |
      | 400:2014                |
=================================

Я хотел бы получить salary_change_history и год, сопоставленный с EID, и показать их на внешнем интерфейсе с помощью l oop.

Чтобы получить их, я попытался сохранить их в массиве с помощью group_concat но он получает только значения, где EID = 1

Вот запрос в бэкэнде

Select 
(select Group_Concat(Employee_Sal_Changes.Salary_Change_History),(Group_Concat(Employee_Sal_Changes.year) from Employee_Sal_Changes left join Employee on Employee_Sal_Changes.EID = Employee.EID), 
Employee.EName
From Employee_Sal_Changes

Есть ли лучший способ или просто использовать group_concat?

1 Ответ

2 голосов
/ 04 апреля 2020

Вы можете использовать агрегацию:

select 
    eid, 
    group_concat(
        year, ':', salary_change_history 
        order by year
        separator '\n'
    ) salary_change_history
from employee_sal_changes
group by eid

Для каждого сотрудника создается список <year>:<salary> значений, разделенных возвратами каретки. Обратите внимание, что вам не нужно вносить таблицу employee для генерации этого набора результатов: другая таблица содержит всю необходимую информацию.

Демонстрация по БД Fiddle :

enter image description here


Если вы также хотите указать имя сотрудника:

select 
    s.eid, 
    e.ename,
    group_concat(
        s.year, ':', s.salary_change_history 
        order by s.year
        separator '\n'
    ) salary_change_history
from employee_sal_changes s
inner join employee e on e.eid = s.eid
group by s.eid, e.ename
...