2016-05-19 1 views
0

Я построил несколько таблиц и запросов на SQL Server, но теперь я застрял в том, как заставить их работать вместе в этой последней задаче. Есть таблица, мы будем называть ее ServerAssessment. В нем есть список серверов, таких как их имя и их серверная версия, которая является разработчиком, производством, неизвестным и т. Д. Существует гораздо большая таблица под названием DatabaseDetails, содержащая тысячи записей о идентификаторах. Каждая строка имеет имя сервера, имя пользователя и другие детали, которые здесь не нужны. Трудность, с которой я сталкиваюсь, заключается в том, что мне нужно создать запрос, в котором перечислены только серверы разработчиков (WHERE Server Edition = 'Developer'), но затем следует и перечисляет каждое отдельное имя пользователя (из DatabaseDetails) после него. С точки зрения логики SQL, я не уверен, как это лучше всего выполнить. Казалось бы, что-то вроде этого? Или я прихожу к этому полностью из-за неправильного угла?SQL Query для создания списка доступа пользователей к серверам

ServerA001 User00001 User00002 User00003 User00111 
ServerA015 User00001 User00002 User60005 User29031 User11111 
ServerC037 User00001 User00009 
ServerD066 User00001 User00002 User00003 User12312 User12333, User14141 
ServerN123 User00001 User00003 User00009 

Опять же, у пользователя может быть доступ ко многим, многим серверам. Вместо того, чтобы перечислять все на отдельном сервере, вместо этого переставьте все так, чтобы он был отдельным/уникальным пользователем, а затем перечислил серверы? Будет ли более идеальным в профессиональной атмосфере?

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

SELECT 
    DISTINCT [Server Name] 
    , [Server Edition] 
FROM [ServerAssessment] AS tabDI 
    FULL JOIN [DatabaseDetails] AS tabUD 
     ON tabDI.[Server Name] = tabUD.[Server Name] 
WHERE [SQL Server Edition] = 'Developer' 
ORDER BY [Computer Name] ASC 

PS: Это были первоначально таблицы в Excel, но я импортировал это в SQL Server, так как я чувствую себя более комфортно с SQL как часть моей работы за последние несколько месяцев.

ответ

0

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

Во-вторых, вам нужно будет найти, как сделать динамический sql-элемент, если вы хотите сделать это в SQL. Это вызовет проблемы при создании отчета по мере изменения количества столбцов. Я предлагаю вам использовать инструмент отчетности, который может автоматически настраиваться для вас. Я сделал что-то подобное, используя SSRS/

0

Я хотел бы использовать функцию row_number с PIVOT совмещены таким образом, оператор:

SELECT * 
FROM (
    SELECT /*DISTINCT*/ tabDI.[ServerName], [UserName], 
     ColNum = ROW_NUMBER() OVER(PARTITION BY tabDI.[ServerName] ORDER BY [UserName]) 
    FROM (VALUES 
     ('ServerA001', 'Developer'), 
     ('ServerA002', 'Enterprise'), 
     ('ServerA015', 'Developer') 
    ) AS tabDI ([ServerName], [SQL Server Edition]) -- [ServerAssessment] 
    LEFT JOIN (VALUES -- LEFT JOIN for servers without users 
     ('ServerA001', 'User00001'), 
     ('ServerA001', 'User00002'), 
     ('ServerA001', 'User00003'), 
     ('ServerA001', 'User00006'), 
     ('ServerA002', 'User00001'), 
     ('ServerA015', 'User00003'), 
     ('ServerA015', 'User00004') 
    ) AS tabUD ([ServerName], [UserName]) -- [DatabaseDetails] 
    ON tabDI.[ServerName] = tabUD.[ServerName] 
    WHERE [SQL Server Edition] = 'Developer' 
) x 
PIVOT (MAX(x.UserName) FOR x.ColNum IN ([1], [2], [3], [4] /*, ...*/)) y 
ORDER BY y.[ServerName] 

Примечание: Это решение работает для ограниченного числа пользователей (4 в описанном выше случае).

Смежные вопросы