She*_*iad 0 sql sql-server stored-procedures
我有两个表,用于级别(管理员,主持人,代理等)的“表A”和用于用户的“表B”,其中一列表示引用“表A”的级别ID。我希望存储过程将用户名归类,但结果必须在这样的一列中:
那是我的两张桌子:
TableA
+---------------------------+
|Level ID |Level Name |
+---------------------------+
|1 |Admin |
+---------------------------+
|2 |Moderator |
+---------------------------+
|3 |Agent |
+---------------------------+
Run Code Online (Sandbox Code Playgroud)
TableB
+---------------------------+
|Username |Level ID |
+---------------------------+
|John |1 |
+---------------------------+
|Sam |2 |
+---------------------------+
|Tommy |2 |
+---------------------------+
|Tony |3 |
+---------------------------+
|Patrick |3 |
+---------------------------+
|Jimmy |3 |
+---------------------------+
|Tod |3 |
+---------------------------+
Run Code Online (Sandbox Code Playgroud)
这就是我想要查询结果的方式:
+-------------+
|Admin |
+-------------+
| John |
+-------------+
| |
+-------------+
|Moderator |
+-------------+
| Sam |
+-------------+
| Tommy |
+-------------+
| |
+-------------+
|Agent |
+-------------+
| Tony |
+-------------+
| Patrick |
+-------------+
| Jimmy |
+-------------+
| Tod |
+-------------+
Run Code Online (Sandbox Code Playgroud)
它只能是一列,并且可以在名称前添加空格
CONCAT(' ', TableA.Username)
Run Code Online (Sandbox Code Playgroud)
每个级别类别中姓氏后面都有一个空白单元格。我正在使用SQL Management Studio 18
使用union all和order by:
select name
from ((select levelname as name, levelid, 1 as ord
from tablea
) union all
(select ' ' + username, levelid, 2 as ord
from tableb
)
) ul
order by levelid, ord;
Run Code Online (Sandbox Code Playgroud)
这实际上不包括空白行,您还可以包括:
select name
from ((select levelname as name, levelid, 1 as ord
from tablea
) union all
(select ' ' + username, levelid, 2 as ord
from tableb
) union all
(select null, levelid, 0 as ord
from tablea
where levelid > 1
)
) ul
order by levelid, ord;
Run Code Online (Sandbox Code Playgroud)
所有这些。您可以在SQL中进行此转换。但是,在应用程序层中进行此类格式化更为典型。