3

この質問に適切なタイトルを付けるのは難しいですが、以下で詳しく説明します。質問をしやすくするために、これらの表を少し単純化します。

次の列を持つ「ユーザー」というテーブルがあります。

UserRowId (PK)
FirstName
LastName
RegionRowId (FK)
Active

次の列を持つ「地域」というテーブルがあります。

RegionRowId
RegionDesc
UserRowId

ここでのロジックは、ユーザーが 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

私が問題を抱えているのは:

UserRowId の代わりに、地域マネージャーの LastName (上記の出力の RegManager 列) を取得することは (私の人生では) できません。私は自分のクエリで dbo.[Region].UserRowId をプルしていることを知っているので、明らかにそれが出力に表示されます。ただし、その ID を使用して User テーブルを相互参照し、そのマネージャーの名前を取得する必要があります。

UserRowId でユーザー テーブルと地域テーブルを結合しようとすると、ユーザーのリストではなく地域マネージャーのリストと、そのユーザーの地域マネージャーの列が取得されます。

これを達成するためにそこにサブクエリが必要ですか?

解決策を得るために何かを明確にする必要がある場合はお知らせください。

ありがとうございました

4

2 に答える 2

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

あなたがする必要があるのは、テーブルでを使用してテーブルを再度結合し、それUserをエイリアスして、参加している他のテーブルとは別に参照できるようにすることです。UserRowIdRegionUser

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 に答える