Это "пахнет" введением логики "просмотр / вывод" в базу данных ... если у вас есть уровни и имена пользователей через LEFT JOIN, то итерируйте результаты в любом приложении, которое вы создаете, создавая выводкак вам нужно .....
Однако, вот один из способов достижения того, что вы хотите .... все равно не рекомендую, хотя
- редактировать - это движетданные отличаются от ответа @ikram тем, что вам не нужно редактировать сохраненный процесс при добавлении новых уровней
USE tempdb
GO
DROP TABLE IF EXISTS TableA
DROP TABLE IF EXISTS TableB
DROP TABLE IF EXISTS #wibble
GO
CREATE TABLE TableA (
levelid INTEGER
, name VARCHAR(10)
)
INSERT INTO TableA
VALUES (1, 'Admin')
, (2, 'Moderator')
, (3, 'Agent')
-- SELECT * FROM TableA
CREATE TABLE TableB (
username VARCHAR(10)
, levelid INTEGER
)
INSERT INTO TableB
VALUES ('John', 1)
, ('Sam', 2)
, ('Tommy', 2)
, ('Tony', 3)
, ('Patrick', 3)
, ('Jimmy', 3)
-- SELECT * FROM TableB
-- table to hold interim results before output
CREATE TABLE #wibble (
wobble varchar(10)
, dummyorder integer
)
-- first insert, the levels
INSERT INTO #wibble
SELECT name
, levelid * 1000 -- pick a number where the gap between numbers of users in levels is sufficient -- could be derived via count
FROM TableA
-- second insert, the users, placed "inside" the relevent level
; WITH users AS (
SELECT '---' + username as username
, levelid
, ROW_NUMBER() over (PARTITION by levelid order by username) as rn --row number of that user in that level
FROM TableB
)
INSERT INTO #wibble
SELECT username, (levelid * 1000) + rn from users
UNION ALL
SELECT null, (levelid * 1000) + rn + 1
FROM ( -- add a "dummy" row into each level, one number up from the max number of users in that level
SELECT levelid, max(rn) as rn from users
GROUP BY levelid
) AS D
-- final output
select wobble from #wibble order by dummyorder