很难获得这个问题的好标题,但我将在下面详细解释。我将简化这些表格以使问题更容易提出。
我有一个名为'User'的表,其中包含以下列:
UserRowId (PK)
FirstName
LastName
RegionRowId (FK)
Active
我有一个名为'Region'的表,其中包含以下列:
RegionRowId
RegionDesc
UserRowId
这里的逻辑是,用户属于“Region”,由User表中的RegionRowId标记。每个区域(在“区域”表中)都有一个区域管理器,由“区域”表中的“UserRowId”列(“用户”表中的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
我遇到的问题是:
我不能(在我的生活中)获取区域管理器的LastName(上面输出中的RegManager列)而不是UserRowId。我知道在我的查询中我正在拉dbo。[Region] .UserRowId显然这就是我在输出中得到的东西。但是,我需要的是使用该ID交叉引用User表以提取该管理器的名称。
当我尝试通过UserRowId加入用户表和区域表时,我得到一个区域管理器列表而不是用户列表,以及该用户的区域管理器列。
我是否需要一个子查询才能完成此任务?
感谢任何帮助,如果我需要澄清任何问题以获得解决方案,请告诉我。
谢谢
答案 0 :(得分: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
答案 1 :(得分:2)
您需要做的是使用User
表中的UserRowId
再次加入Region
表,并将其别名,以便它可以与另一个{{1}分开引用它1}}你加入的表:
User