我想根据某些标准确定每个用户还剩下什么课程。我收到2个数据集。我想使用MS Access 2013来处理数据。
数据集1:所有用户的主列表
数据集2:每个用户的课程完成列表
根据用户所属的类别确定他们需要完成哪些课程。数据集并不完全干净也不完美。
数据集1
NAME CATEGORY
TOASTER, OVEN 3
MICRO, WAVE 2
WHITE, BOARD 1
MOUSE, PAD 1
KEY, BOARD 4
PHONE, CHARGER 2
WATER, BOTTLE 2
数据集2
NAME COURSE DATE
TOASTER, OVEN 3A 2000-05-05
TOASTER, OVEN 3B 2019-03-02
TOASTER, OVEN 3A 2018-11-05
MICRO, WAVE 2A 2017-10-20
WHITE, BOARD 1A 2018-01-10
KEY, BOARD 3A-1 2019-01-15
PHONE, CHARGER 2A-1 2018-09-17
WATER, BOTTLE 2A-CL 2015-06-26
WATER, BOTTLE 2A 2011-12-15
期望的结果
NAME CATEGORY REQUIREMENT STATUS
TOASTER, OVEN 3 ADVANCED COMPLETED
MICRO, WAVE 2 INTERMEDIATE COURSE 2 REMAINING
WHITE, BOARD 1 INTRODUCTORY COMPLETED
MOUSE, PAD 1 INTRODUCTORY NOT COMPLETED
KEY, BOARD 4 ADVANCED COURSE 1 REMAINING
PHONE, CHARGER 2 INTERMEDIATE COURSE 2 REMAINING
WATER, BOTTLE 2 INTERMEDIATE COMPLETED
基于这两个数据集,我希望期望的结果显示数据集1的另外两列。
逻辑:
如果CATEGORY = 3
,REQUIREMENT = ADVANCED
。如果CATEGORY = 2
,REQUIREMENT = INTERMEDIATE
。如果CATEGORY = 1
,REQUIREMENT = INTRODUCTORY
。这种逻辑,我可以执行。
If REQUIREMENT = ADVANCED
, then check Data Set 2
to see if course 3A AND 3B
exist, OR if 3A-CL
, OR if 3A-EQ
exist, then STATUS = COMPLETED
, ELSE IF ONLY 3A exists
, then say Course 2 Remaining
, ELSE IF ONLY 3B exists
, then say Course 1 Remaining
.
If REQUIREMENT = INTERMEDIATE
, then check Data Set 2
to see if course 2A and 2B exist
, OR if 2A-CL
, OR if 2A-EQ
exist, then STATUS = COMPLETED
, ELSE IF ONLY 2A exists
, then say Course 2 Remaining
, ELSE IF ONLY 3B exists
, then say Course 1 Remaining
.
If REQUIREMENT = INTRODUCTORY
, then check Data Set 2
to see if Course 1A OR 1A-CL OR 1A-EQ exist
, then STATUS = COMPLETED
, ELSE NOT COMPLETED
.
Please let me know if I need to clarify anything.
I would appreciate any assistance or guidance on this at all!
一种方法是对第二个数据集进行多次联接。此示例包括完成任务所需的所有元素。您只需要将其扩展到所需逻辑的其余部分即可:
SELECT T1.NAME,
T1.CATEGORY,
ISNULL(IS_3A.DATE) AS EXISTS_3A_EXAMPLE,
NOT (ISNULL(IS_3A.DATE) OR ISNULL(IS_3B.DATE)) AS EXISTS_3A_AND_3B_EXAMPLE
FROM (( [DATA SET 1] T1
LEFT JOIN [DATA SET 2] IS_3A ON IS_3A.COURSE='3A' AND T1.NAME=IS_3A.NAME )
LEFT JOIN [DATA SET 2] IS_3B ON IS_3B.COURSE='3B' AND T1.NAME=IS_3B.NAME )
LEFT JOIN [DATA SET 2] IS_3A_CL ON IS_3A_CL.COURSE='3A-CL' AND T1.NAME=IS_3A_CL.NAME
什么是
ISNULL(IS_3A.DATE) AS EXISTS_3A_EXAMPLE, NOT (ISNULL(IS_3A.DATE) OR ISNULL(IS_3B.DATE)) AS EXISTS_3A_AND_3B_EXAMPLE
一块SQL做的?SQL中的第三行正在检查DATE
[DATA SET 2]中的字段是否存在(为空)?然后,第四行通过该NOT(ISNULL(...)
功能检查课程结束中是否同时存在3A或3B 。如果我在任何一个方面都不对,请纠正我。我也不太了解其中的LEFT JOIN
逻辑。什么是IS_3A
,IS_3B
以及IS_3A_CL
在您的SQL中?我了解这NAME
部分内容,但没有课程。第三和第四行是如何使用第二张表的各种链接副本来运行逻辑的示例。这样
LEFT JOIN
做的结果是,如果您在该课程中有一条记录(例如3A
,在第一次联接时,则corresponding ALIASED
该表的副本的字段(在本例中为IS_3A
))将具有该记录的值。如果没有3A
针对该人员的记录,那么它们将为null,因此ISNULL
在这些字段(我选择了,DATE
但任何一个都可以)上都会告诉您是否有该NAME-COURSE
组合的记录。因此,我的第四行代码基本上是根据您的要求执行此操作的:“检查数据集2以查看过程3A和3B是否存在”
得到它了!我今天早上醒来时才意识到这些是别名,哎呀!我一直在尝试实施您的解决方案,并从小处着手。我试图一次只识别一种训练。由于[DATA SET 1]为每个用户设置了唯一的记录,而[DATA SET 2]为每个用户设置了可能的重复值,因此我的左联接也重复了一些值,因此我得到的记录比预期的多。我使用
DISTINCT
并且记录数是正确的。同样,所有值最终都将不为null(TRUE)。这是我使用的SQL,以防语法错误。一切都显示为
0
当我期待着相当多的1
值或TRUE
。SELECT DISTINCT R.*, IsNull(A.[Training Level]) AS [ADVANCED - DL] FROM qryRequired AS R LEFT JOIN qry_CES_Bucket AS A ON ((A.[Training Level]="ADVANCED - DL") AND (R.[Name Pers] = A.[Name Pers]));