3

这个问题很难得到一个好的标题,但我会在下面详细解释。我将稍微简化一下这些表格,以使问题更容易提出。

我有一个名为“用户”的表,其中包含以下列:

UserRowId (PK)
FirstName
LastName
RegionRowId (FK)
Active

我有一个名为“区域”的表,其中包含以下列:

RegionRowId
RegionDesc
UserRowId

这里的逻辑是,用户属于用户表中的 RegionRowId 记录的“区域”。每个区域(在“Region”表中)都有一个区域经理,由“Region”表中的“UserRowId”列(来自“User”表的 FK)记录。

我有一个名为“UserTime”的表,其中包含以下列:

UserTimeRowId (PK)
UserRowId (FK)
Hours
Sales

这里的逻辑是用户(由 UserRowId 映射)报告存储在此表中的小时数和销售额。每次用户报告销售额/小时数时,都会创建一个新行。

我要完成的工作:

我正在尝试编写一个查询,该查询将提取该用户的 FirstName、LastName、区域经理、小时总和以及销售额总和。

这是我到目前为止所拥有的:

询问:

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

我遇到的问题是:

我无法(终生)获得区域经理的姓氏(上面输出中的 RegManager 列)而不是 UserRowId。我知道在我的查询中我正在拉 dbo.[Region].UserRowId 很明显这就是我将在输出中得到的。但是,我需要使用该 ID 来交叉引用 User 表以提取该经理的名称。

当我尝试通过 UserRowId 连接用户表和区域表时,我得到一个区域经理列表而不是用户列表,以及该用户的区域经理列。

我需要一个子查询来完成这个吗?

任何帮助表示赞赏,如果我需要澄清任何事情以获得解决方案,请告诉我。

谢谢

4

2 回答 2

2

您不需要子查询,但需要使用别名,这样您就可以多次 JOIN 同一个表(在本例中为用户表)而不会产生歧义。

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
于 2013-01-03T15:06:35.957 回答
2

您需要做的是User再次加入表,使用表UserRowId中的,并为其命名,以便它可以与您加入Region的其他表分开引用它: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
于 2013-01-03T15:06:58.457 回答