SQL-запрос дублирует имена в выводе
Я пишу запрос, который вызывает 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
Я помещаю этот запрос в набор результатов. Если это можно сделать с помощью запроса, это было бы здорово. Если мне нужно сделать это в моем коде приложения, некоторые рекомендации тоже будут полезны, потому что я не уверен, как создать этот вывод.
2 ответа
Подобные вещи часто выполняются в коде приложения (java, php и т. Д.).
MySQL может сделать это внутренне с нестандартной агрегатной функцией, известной как GROUP_CONCAT()
Попробуйте что-то вроде этого.... (не отлажено).
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;
поэтому список не будет усечен. Вы можете использовать любую разумную длину. Возможно, вам придется взглянуть на максимальную длину пакета, если у вас много сотен элементов.
Лично я не думаю, что запрос является правильным местом для форматирования. Вместо этого я бы запросил данные в столбцах, а затем отформатировал их в своем коде или программном обеспечении для составления отчетов.
Но, чтобы ответить на ваш вопрос, вы можете объединить список пользователей, чтобы получить имена, а затем отсортировать результаты, чтобы меню перемежалось с правами. 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