使用内部联接作为联合查询的查询条件
Using an Inner Join as a Query criteria on a Union Query
我有 table 跟踪员工 QA 数据。它跟踪员工 (UserLogin)、员工工作日期 (NoteDate) 和 5 yes/no 字段(以及用于此查询目的的其他不相关字段以及与以下代码匹配的更多趋势)。一个单独的 table 跟踪员工数据,包括他们所在的单位 (Unit)。我有一个联合查询,它正在绘制我为了创建一个总结准确率的交叉表而记下的字段。我现在希望能够使用相同的查询来跟踪一个团队的表现。我尝试使用在两者中都显示为连接的 UserLogin 字段对员工 table 进行内部连接。然后我要求查询使用我在控件中指定的团队来仅查询那些团队成员并汇总他们的数据。这是第一个适用于所有员工的查询。
SELECT ID AS SourceID
, UserLogin
, Year([NoteDate]) AS Yr
, Format([NoteDate], "mmm") AS Mo
, "Appeal" AS Trend
FROM tblQA
WHERE Appeal=False
UNION SELECT ID
, UserLogin
, Year([NoteDate])
, Format([NoteDate], "mmm")
, "NRP"
FROM tblQA
WHERE NRP = False
UNION SELECT ID
, UserLogin
, Year([NoteDate])
, Format([NoteDate], "mmm")
, "ChurnEscalation"
FROM tblQA
WHERE ChurnEscalation = False
UNION SELECT ID
, UserLogin
, Year([NoteDate])
, Format([NoteDate], "mmm")
, "ProtocolNotFollowed"
FROM tblQA
WHERE ProtocolNotFollowed = False
UNION SELECT ID
, UserLogin
, Year([NoteDate])
, Format([NoteDate], "mmm")
, "Resubmission"
FROM tblQA
WHERE Resubmission = False
然后是我在此处尝试使用新代码的前几行。
SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Appeal" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
UNION SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "NRP" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
UNION SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "ChurnEscalation" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
UNION SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "ProtocolNotFollowed" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
UNION SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Resubmission" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
虽然我没有得到看起来有效的结果 - 700% 的趋势准确度和所有趋势相同的值。谁能看出我做错了什么?
Here is an image of the results I get with all items tracked
编辑-好的,我取得了一些进展,但仍然遇到一些麻烦。我在后续查询(基于 June7 的 DataUNION 代码的查询)中意识到,我正在从所有员工中提取我的总 QA 计数,而不仅仅是单位,所以我更改了该代码以添加单位标准。
SELECT DataUNIONUnitAD.Yr
, DataUNIONUnitAD.Mo
, DataUNIONUnitAD.Trend
, Count(DataUNIONUnitAD.UserLogin) AS CountOfUserLogin
, ctqADUnitTrends.CntYrMo
, Count([UserLogin])/[CntYrMo]*100 AS Pct
FROM (
SELECT Year([NoteDate]) AS Yr
, Format([NoteDate],"mmm") AS Mo
, Count(tblQA.ID) AS CntYrMo
FROM tblQA
WHERE (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
GROUP BY Year([NoteDate])
, Format([NoteDate],"mmm")
) AS ctqADUnitTrends INNER JOIN DataUNIONUnitAD ON
(ctqADUnitTrends.Mo = DataUNIONUnitAD.Mo) AND (ctqADUnitTrends.Yr = DataUNIONUnitAD.Yr)
GROUP BY DataUNIONUnitAD.Yr
, DataUNIONUnitAD.Mo
, DataUNIONUnitAD.Trend
, ctqADUnitTrends.CntYrMo;
这给了我正确的数量级百分比,但所有趋势仍然相同。 Image 我试图查看是否可以确定我可能无意中更改了某些内容的位置,但我无法弄清楚。
或者,不更改 UNION 查询,调整后续查询(顺便说一句,注意查询名称的更改):
UNION 查询:
SELECT ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Appeal" AS Trend FROM tblQA WHERE Appeal=True
UNION SELECT ID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "NRP" FROM tblQA WHERE NRP=True
UNION SELECT ID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Churn" FROM tblQA WHERE ChurnEscalation=True
UNION SELECT ID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Protocol" FROM tblQA WHERE ProtocolNotFollowed=True
UNION SELECT ID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Resub" FROM tblQA WHERE Resubmission=True;
聚合查询:
SELECT QA_UNION.Yr, QA_UNION.Mo, QA_UNION.Trend, QA_UNION.UserLogin, tblUser.Unit, Query3.CntYrMo, Count(*) AS CountOfUser, Count(*)/[CntYrMo]*100 AS Pct
FROM tblUser INNER JOIN ((SELECT Year([NoteDate]) AS Yr, Format([NoteDate],"mmm") AS Mo, Count([tblQA].ID) AS CntYrMo FROM tblQA GROUP BY Year([NoteDate]), Format([NoteDate],"mmm")) AS Query3 INNER JOIN QA_UNION ON (Query3.Mo = QA_UNION.Mo) AND (Query3.Yr = QA_UNION.Yr)) ON tblUser.UserLogin = QA_UNION.UserLogin
GROUP BY QA_UNION.Yr, QA_UNION.Mo, QA_UNION.Trend, QA_UNION.UserLogin, tblUser.Unit, Query3.CntYrMo;
然后是 CROSSTAB:
PARAMETERS [Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT] Text ( 255 );
TRANSFORM First(QA_COUNT.Pct) AS FirstOfPct
SELECT QA_COUNT.Yr, QA_COUNT.Trend, QA_COUNT.Unit
FROM QA_COUNT
WHERE (((QA_COUNT.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
GROUP BY QA_COUNT.Yr, QA_COUNT.Trend, QA_COUNT.Unit
PIVOT QA_COUNT.Mo In ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
我有 table 跟踪员工 QA 数据。它跟踪员工 (UserLogin)、员工工作日期 (NoteDate) 和 5 yes/no 字段(以及用于此查询目的的其他不相关字段以及与以下代码匹配的更多趋势)。一个单独的 table 跟踪员工数据,包括他们所在的单位 (Unit)。我有一个联合查询,它正在绘制我为了创建一个总结准确率的交叉表而记下的字段。我现在希望能够使用相同的查询来跟踪一个团队的表现。我尝试使用在两者中都显示为连接的 UserLogin 字段对员工 table 进行内部连接。然后我要求查询使用我在控件中指定的团队来仅查询那些团队成员并汇总他们的数据。这是第一个适用于所有员工的查询。
SELECT ID AS SourceID
, UserLogin
, Year([NoteDate]) AS Yr
, Format([NoteDate], "mmm") AS Mo
, "Appeal" AS Trend
FROM tblQA
WHERE Appeal=False
UNION SELECT ID
, UserLogin
, Year([NoteDate])
, Format([NoteDate], "mmm")
, "NRP"
FROM tblQA
WHERE NRP = False
UNION SELECT ID
, UserLogin
, Year([NoteDate])
, Format([NoteDate], "mmm")
, "ChurnEscalation"
FROM tblQA
WHERE ChurnEscalation = False
UNION SELECT ID
, UserLogin
, Year([NoteDate])
, Format([NoteDate], "mmm")
, "ProtocolNotFollowed"
FROM tblQA
WHERE ProtocolNotFollowed = False
UNION SELECT ID
, UserLogin
, Year([NoteDate])
, Format([NoteDate], "mmm")
, "Resubmission"
FROM tblQA
WHERE Resubmission = False
然后是我在此处尝试使用新代码的前几行。
SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Appeal" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
UNION SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "NRP" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
UNION SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "ChurnEscalation" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
UNION SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "ProtocolNotFollowed" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
UNION SELECT tblQA.ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Resubmission" AS Trend FROM tblQA INNER JOIN tblUser ON tblQA.UserLogin = tblUser.UserLogin WHERE Appeal=FALSE AND (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
虽然我没有得到看起来有效的结果 - 700% 的趋势准确度和所有趋势相同的值。谁能看出我做错了什么?
Here is an image of the results I get with all items tracked 编辑-好的,我取得了一些进展,但仍然遇到一些麻烦。我在后续查询(基于 June7 的 DataUNION 代码的查询)中意识到,我正在从所有员工中提取我的总 QA 计数,而不仅仅是单位,所以我更改了该代码以添加单位标准。
SELECT DataUNIONUnitAD.Yr
, DataUNIONUnitAD.Mo
, DataUNIONUnitAD.Trend
, Count(DataUNIONUnitAD.UserLogin) AS CountOfUserLogin
, ctqADUnitTrends.CntYrMo
, Count([UserLogin])/[CntYrMo]*100 AS Pct
FROM (
SELECT Year([NoteDate]) AS Yr
, Format([NoteDate],"mmm") AS Mo
, Count(tblQA.ID) AS CntYrMo
FROM tblQA
WHERE (((tblUser.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
GROUP BY Year([NoteDate])
, Format([NoteDate],"mmm")
) AS ctqADUnitTrends INNER JOIN DataUNIONUnitAD ON
(ctqADUnitTrends.Mo = DataUNIONUnitAD.Mo) AND (ctqADUnitTrends.Yr = DataUNIONUnitAD.Yr)
GROUP BY DataUNIONUnitAD.Yr
, DataUNIONUnitAD.Mo
, DataUNIONUnitAD.Trend
, ctqADUnitTrends.CntYrMo;
这给了我正确的数量级百分比,但所有趋势仍然相同。 Image 我试图查看是否可以确定我可能无意中更改了某些内容的位置,但我无法弄清楚。
或者,不更改 UNION 查询,调整后续查询(顺便说一句,注意查询名称的更改):
UNION 查询:
SELECT ID AS SourceID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Appeal" AS Trend FROM tblQA WHERE Appeal=True
UNION SELECT ID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "NRP" FROM tblQA WHERE NRP=True
UNION SELECT ID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Churn" FROM tblQA WHERE ChurnEscalation=True
UNION SELECT ID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Protocol" FROM tblQA WHERE ProtocolNotFollowed=True
UNION SELECT ID, tblQA.UserLogin, Year([NoteDate]) AS Yr, Format([NoteDate], "mmm") AS Mo, "Resub" FROM tblQA WHERE Resubmission=True;
聚合查询:
SELECT QA_UNION.Yr, QA_UNION.Mo, QA_UNION.Trend, QA_UNION.UserLogin, tblUser.Unit, Query3.CntYrMo, Count(*) AS CountOfUser, Count(*)/[CntYrMo]*100 AS Pct
FROM tblUser INNER JOIN ((SELECT Year([NoteDate]) AS Yr, Format([NoteDate],"mmm") AS Mo, Count([tblQA].ID) AS CntYrMo FROM tblQA GROUP BY Year([NoteDate]), Format([NoteDate],"mmm")) AS Query3 INNER JOIN QA_UNION ON (Query3.Mo = QA_UNION.Mo) AND (Query3.Yr = QA_UNION.Yr)) ON tblUser.UserLogin = QA_UNION.UserLogin
GROUP BY QA_UNION.Yr, QA_UNION.Mo, QA_UNION.Trend, QA_UNION.UserLogin, tblUser.Unit, Query3.CntYrMo;
然后是 CROSSTAB:
PARAMETERS [Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT] Text ( 255 );
TRANSFORM First(QA_COUNT.Pct) AS FirstOfPct
SELECT QA_COUNT.Yr, QA_COUNT.Trend, QA_COUNT.Unit
FROM QA_COUNT
WHERE (((QA_COUNT.Unit)=[Forms]![MainMenu]![btnManagersMenu].[Form]![txtADUnitPT]))
GROUP BY QA_COUNT.Yr, QA_COUNT.Trend, QA_COUNT.Unit
PIVOT QA_COUNT.Mo In ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");