将用户的主列表与第二列表进行比较,第二列表具有每个用户多个条目

时间:2019-07-03 15:44:21

标签: ms-access

我正在尝试根据某些标准来确定每个用户剩余的课程。我收到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

基于2个数据集,我希望期望的结果显示数据集1的另外2列。

逻辑:

如果为CATEGORY = 3,则为REQUIREMENT = ADVANCED。 如果为CATEGORY = 2,则为REQUIREMENT = INTERMEDIATE。 如果为CATEGORY = 1,则为REQUIREMENT = INTRODUCTORY。 这种逻辑,我可以执行。

如果REQUIREMENT = ADVANCED,则检查Data Set 2,看是否存在路线3A AND 3BOR if 3A-CLOR if 3A-EQ,然后STATUS = COMPLETED,其他{ {1}},然后说IF ONLY 3A exists,然后说Course 2 Remaining,然后说IF ONLY 3B exists

如果Course 1 Remaining,则检查REQUIREMENT = INTERMEDIATE以查看路线Data Set 22A and 2B existOR if 2A-CL是否存在,然后OR if 2A-EQ,其他{{ 1}},然后说STATUS = COMPLETED,然后说IF ONLY 2A exists,然后说Course 2 Remaining

如果为IF ONLY 3B exists,则检查Course 1 Remaining,看看是否REQUIREMENT = INTRODUCTORY,然后为Data Set 2,否则为Course 1A OR 1A-CL OR 1A-EQ exist

请让我知道是否需要澄清任何内容。

在此方面,我将不胜感激!

1 个答案:

答案 0 :(得分:1)

一种方法是对第二个数据集进行多次联接。此示例包括完成任务所需的所有元素。您只需要将其扩展到所需逻辑的其余部分即可:

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