2016-05-19 18 views
0

我已經在SQL Server中構建了一些表和查詢,但現在我堅持如何使它們在最新任務中一起工作。 有一張表,我們稱之爲ServerAssessment。它有一個服務器清單,比如他們的Name和Server Edition,它們是Developer,Production,Unknown等。還有一個名爲DatabaseDetails的表,它包含數千個關於ID的記錄。每一行都有一個服務器名稱,一個用戶名以及這裏不需要的其他詳細信息。 我遇到的困難是我需要生成一個只列出開發人員服務器(WHERE Server Edition ='Developer')的查詢,然後跟蹤並列出每個不同的用戶名(來自DatabaseDetails)。 從SQL邏輯的角度來看,我不確定這是如何最好地完成。它會看起來像這樣,我會想?或者,我是否從錯誤的角度來完成這件事?用於向服務器生成用戶訪問列表的SQL查詢

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 

此外,用戶可以訪問許多許多服務器。應該不是將所有內容都列出來,而是將所有內容都轉換爲獨特/唯一的用戶,然後列出服務器?在職業氛圍中會更理想嗎?

我目前所有的東西都是短而甜,加入表格並確保只有開發者返回。 PS:這些最初是Excel中的表格,但是我將它導入到SQL Server中,因爲我對過去幾個月的工作感到更加適應SQL。

回答

0

首先,使用完全連接會爲您提供與開發人員服務器沒有直接關係的詳細信息記錄。您想要使用左連接來獲取所有開發服務器,但只能使用與其相關的詳細信息。

其次,如果您想在SQL中執行此操作,則必須查找如何執行動態SQL數據透視表。這會在創建報告時造成麻煩,因爲列數會發生變化。我建議你使用可以自動爲你轉動的報表工具。我沒有類似的東西使用SSRS/

0

我會togheter使用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)數量有限。