SQL查询在输出中复制名称

问题描述 投票:0回答:2

我正在写一个调用employee nameemployee's usernamesecurity levelmenumenu's tabsmenu descriptions的查询。我希望查询只显示employee nameusername一次作为列,然后显示security levelmenumenu tabsmenu 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

我将此查询放入结果集中。如果可以通过一个很棒的查询来完成。如果我需要在我的应用程序代码中执行此操作,那么一些指导也会被批准,因为我不确定如何生成此输出。

java mysql sql iseries-navigator
2个回答
0
投票

这种事情通常在应用程序代码(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;

所以列表不会被截断。你可以使用任何合理的长度。如果您有数百个项目,则可能需要查看max-packet-length。


0
投票

我个人认为查询不是进行格式化的正确位置。相反,我会有一个查询返回列中的数据,然后在我的代码或报告软件中格式化它。

但是,要回答您的问题,您可以将用户列表联合起来获取名称,然后对结果进行排序以使菜单穿插权利。 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
© www.soinside.com 2019 - 2024. All rights reserved.