SQL-запрос дублирует имена в выводе - PullRequest
0 голосов
/ 18 декабря 2018

Я пишу запрос, который вызывает employee name, employee's username, security level, menu, menu's tabs и menu descriptions.Я хочу запрос только отображать employee name и username один раз в качестве столбца, а затем отображать security level, menu, menu tabs и menu description.

Select usname as Name,
Ususer as Username,
Uswosecl as WO_SecurityLevel,
AoOpID as Operation_ID, aoseclevel as Operation_Security,
AoMenu as Menu, AoMenuItem as Tab, AoText as Description
from cudtatet.xxpuser
join fmsusrfua.xxpauops on uswosecl >= aoseclevel
and aoseclevel >= 0
where ususer NOT IN (‘*ALL’,’daffron’)
and aoAuOpID >=70000 and aoAuOpID < 80000
order by usname, ususer

Я бы опубликовал свой вывод, но он довольно большой, поэтому я собираюсь обобщить то, что я получаю.

NAME        USERNAME      SEC LEVEL      MENU         TAB           DESC   
AIKO R.    ariggins       4              HELP        TIME ENTRY     MESSAGES
AIKO R.    ariggins       4              HELP        ABOUT          ABOUT
AKIO R.    ariggins       4              HELP        CHANGEPASS   CHANGEPASS
.......

То, что я хотел бы получить в качестве вывода:

 NAME: AKIO R.    USERNAME: ariggins   SECLEVEL: 4
 Menu: HELP > TIME ENTRY > MESSAGES
       HELP > ABOUT > ABOUT
       HELP > CHANGE PASSWORD > CHANGE PASSWORD
.....
 NAME: THE NEXT EMPLOYEE USERNAME: EMPLOYEE USERNAME SECLEVEL: 6
 MENU: HELP > TIME ENTRY > TIME ENTRY
       HELP > ABOUT > ABOUT
       HELP > AD-HOC > AD-HOC
....CONTINUES UNTIL COMPLETE

I 'Я помещаю этот запрос в набор результатов.Если это можно сделать с помощью запроса, это было бы здорово.Если мне нужно сделать это в коде моего приложения, то будет также полезно некоторое руководство, потому что я не уверен, как создать этот вывод.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

Но, чтобы ответить на ваш вопрос, вы можете объединить список пользователей, чтобы получить имена, а затем отсортировать результаты, чтобы меню перемежалось с правами.Row_number используется для скрытия меню первого элемента.

Примечание. Некоторые поля были удалены для упрощения, но вы можете добавить их обратно.

SELECT case when x.MenuName IS NULL THEN 'Name: ' + x.Name + ' UserName: ' + x.UserName'
ELSE case when rn=1 then 'Menu: ' else '     ' end + x.Menu END Output
FROM
(Select usname Name, Ususer UserName, NULL Menu, 0 rn
From  cudtatet.xxpuser
UNION
Select usname as Name,
Ususer as Username,
AoMenu as Menu,
Row_Number() Over (Partition BY usname Order BY AoMenu) rn
from cudtatet.xxpuser
join fmsusrfua.xxpauops on uswosecl >= aoseclevel
and aoseclevel >= 0
where ususer NOT IN (‘*ALL’,’daffron’)
and aoAuOpID >=70000 and aoAuOpID < 80000)
) x
ORDER BY x.Name, x.rn
0 голосов
/ 18 декабря 2018

Подобные вещи часто выполняются в коде приложения (java, php и т. Д.).

MySQL может делать это внутренне с помощью нестандартной агрегатной функции, известной как GROUP_CONCAT()* 1006.*

Попробуйте что-то вроде этого .... (не отлажено).

Select usname as Name, 
       Ususer as Username,
       Uswosecl as WO_SecurityLevel,
       AoOpID as Operation_ID, aoseclevel as Operation_Security,
       GROUP_CONCAT(CONCAT( AoMenu, '>' , AoMenuItem , '>', AoMenuItem )) menu
  from whatever
  join whatever ON ....
  where ...
  group by  usname  Ususer, Uswosecl, AoOpID, aoseclevel
  order by usname, ususer

В зависимости от того, сколько элементов меню у каждого пользователя есть, вы можете использовать этот

 SET group_concat_max_len = 10000;

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

...