2013-01-03 58 views
3

這個問題很難得到好的標題,但我會在下面進行詳細解釋。我將簡化這些表格,使問題更容易提出。如何從用戶名中獲取用戶名(SQL聯接)

我有一個名爲「用戶」與下面的列表:

UserRowId (PK) 
FirstName 
LastName 
RegionRowId (FK) 
Active 

我有一個名爲「區域」與下面的列表:

RegionRowId 
RegionDesc 
UserRowId 

這裏的邏輯是,一個用戶屬於由用戶表中的RegionRowId標識的「區域」。每個地區(在「地區」表中)都有一個地區經理,由「地區」表中的「UserRowId」列(來自「用戶」表的FK)註明。

我有一個叫做「UserTime」與下面的列表:

UserTimeRowId (PK) 
UserRowId (FK) 
Hours 
Sales 

這裏的邏輯是用戶(通過UserRowId映射)報告時間和銷售,其獲取存儲在該表中。每次用戶報告銷售/小時數時,都會創建一個新行。

我試圖做到:

我想寫一個查詢,將拉動名字,姓氏,這個用戶的區域經理的時間總和,總和的銷售額。

這是我到目前爲止有:

查詢:

SELECT dbo.[User].FirstName, dbo.[User].LastName, 
dbo.[Region].UserRowId AS RegManager, dbo.[Region].RegionDesc AS Desc, 
SUM(dbo.[UserTime].Sales) AS Sales, SUM(dbo.[UserTime].Hours) AS Hours 
FROM dbo.[UserTime] 
INNER JOIN dbo.[User] ON dbo.[UserTime].UserRowid = dbo.[User].UserRowId 
INNER JOIN dbo.[Region] ON dbo.[User].RegionRowId = dbo.[Region].RegionRowId 
WHERE dbo.[User].Active = 1 
GROUP BY dbo.[User].FirstName, dbo.[User].LastName, 
dbo.[Region].UserRowId, dbo.[Region].RegionDesc 

輸出(例如):

FirstName LastName RegManager RegionDesc Sales Hours 
Bob   Man  773   NYC   500  5 

什麼我有麻煩的是:

我不能(對我來說)獲取區域管理器的LastName(上面輸出中的RegManager列)而不是UserRowId。我知道在我的查詢中我拉dbo。[Region] .UserRowId很明顯,這就是我會在輸出中得到的。但是,我需要的是使用該ID來交叉引用用戶表來提取該管理器的名稱。

當我嘗試加入用戶表,並由UserRowId區表,我得到區域經理的列表,而不是用戶的列表,並且該用戶的區域經理一列。

我需要一個子查詢來完成這個嗎?

任何幫助表示讚賞,並請讓我知道,如果我需要澄清任何問題以得到解決方案。

謝謝

+0

對於做得好的問題+1。 – Lucero

回答

2

你不需要子查詢,但你需要使用別名,這樣就可以加入同一個表(在這種情況下,用戶表)多次不會產生歧義。

SELECT u.FirstName, u.LastName, 
m.FirstName AS RegManagerFirstName, m.LastName AS RegManagerLastName, r.RegionDesc AS [Desc], 
SUM(ut.Sales) AS Sales, SUM(ut.Hours) AS Hours 
FROM dbo.[UserTime] AS ut 
INNER JOIN dbo.[User] AS u ON ut.UserRowid = u.UserRowId 
INNER JOIN dbo.[Region] AS r ON u.RegionRowId = r.RegionRowId 
INNER JOIN dbo.[User] AS m ON r.UserRowid = m.UserRowId 
WHERE u.Active = 1 
GROUP BY u.FirstName, u.LastName, m.FirstName, m.LastName, r.RegionDesc 
+0

這工作,謝謝! – ThiagoNSiq

2

你需要做的是在JOIN表User再次,使用在RegionUserRowId和別名,以便它可以從你已經加入其他User表單獨引用它是什麼:

SELECT dbo.[User].FirstName, dbo.[User].LastName, 
Manager.FirstName AS RegManagerFirstName, Manager.LastName AS RegManagerLastName, dbo.[Region].RegionDesc AS Desc, 
SUM(dbo.[UserTime].Sales) AS Sales, SUM(dbo.[UserTime].Hours) AS Hours 
FROM dbo.[UserTime] 
INNER JOIN dbo.[User] ON dbo.[UserTime].UserRowid = dbo.[User].UserRowId 
INNER JOIN dbo.[Region] ON dbo.[User].RegionRowId = dbo.[Region].RegionRowId 
INNER JOIN dbo.[User] Manager ON dbo.[Region].UserRowId = Manager.UserRowId 
WHERE dbo.[User].Active = 1 
GROUP BY dbo.[User].FirstName, dbo.[User].LastName, Manager.FirstName, 
Manager.LastName 
+0

不是'dbo。[User] .' *含糊不清,需要別名嗎? – Lucero

+0

@Lucero不屬於我使用SQL Server 2008的經驗。別名只是其中之一意味着仍然只有一個表被'dbo。[User]'引用,所以沒有混淆。 –

+0

對,試過了,我不知道這個別名替換了這個名字,而不僅僅是增加了另外一個可以被查詢的名字。不過,我認爲使用別名是一個好主意。 – Lucero