Задать вопрос
GeraJet
@GeraJet
Anykey

Как сформировать SQL-запрос c группировкой по одному столбцу?

Приветствую всех.
Набросал вот такой запрос:
SELECT
   USERINFO.Name,
   USERINFO.lastname,
   FORMAT(acc_monitor_log.[time], 'dd.MM.yyyy, HH:mm') AS 'Time', 
   acc_monitor_log.pin,
   acc_monitor_log.event_point_name
FROM
  acc_monitor_log
  INNER JOIN USERINFO
    ON USERINFO.USERID = acc_monitor_log.pin
WHERE USERINFO.DEFAULTDEPTID = 15 AND
      acc_monitor_log.event_type = 1000 AND
	  acc_monitor_log.event_point_id >= 1 
/*GROUP BY acc_monitor_log.event_point_name*/
ORDER BY acc_monitor_log.[time] DESC 
OFFSET 1000 ROWS FETCH NEXT 10 ROWS ONLY

Получаю на выходе:
Name           lastname      Time                   pin        event_point_name
--------------------------------------------------------------------------------
Петров         Петр          15.01.2019, 08:25       69        Вход
Андреев        Андрей        15.01.2019, 08:16       61        Вход
Андреев        Андрей        15.01.2019, 08:16       61        Выход
Олегов         Олег          15.01.2019, 08:04       111       Выход

Мне же нужно, чтобы сотрудник с pin=61, Андрей, отображался одной строчкой, но в столбцах Time и
event_point_name чтоб было несколько значений:
Name           lastname      Time                   pin        event_point_name
--------------------------------------------------------------------------------
Андреев        Андрей        15.01.2019, 08:16       61        Вход
                             15.01.2019, 08:16       61        Выход

Т.е. нужна группировка по уникальным pin. Помогите пожалуйста дописать запрос
  • Вопрос задан
  • 244 просмотра
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 4
tsklab
@tsklab Куратор тега Transact-SQL
Здесь отвечаю на вопросы.
У вас не показано по какому признаку нужно не показывать [Name] и [lastname].
Ответ написан
Комментировать
seganim
@seganim
PHP-программист, программный инженер
SQL многомерные данные не вернет, как-никак строковые записи. Вам подойдет использование функции concat, позволяющей "склеить" поля. Вот тут есть описание. Группируете по pin и event_point_name, склеиваете нужное Вам, парсите при выводе и получаете желаемый формат.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
"выход" - это результат выполнения запроса в SQL Management Studio?

Обычно такого типа "сокрытия повторяющихся значений" (прицепом выравнивания и т.п.) - это епархия репортеров и т.п.
A SQL честно отдает таблицу.

Ну или как выше про concat из MySQL писали, только в MS SQL это будет stub + for xml
Ответ написан
Комментировать
@180Ringing
Добавьте в select столбец row_number() over (partition by pin order by time) as RN
Оберните ваш запрос в CTE и выберете из него.
Select iif(RN = 1 ,Name, '' ), iif(RN = 1 ,Last name, '' ) ,Time , pin , event_point_name from cte

Это ориентировочно
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы