0

我在 MS Access 中有一个包含调查结果的数据表,并且我有一个基于调查结果的风险 ID 和风险描述的查找表。

到目前为止,我尝试的是从我的调查表中选择不同的条目,并在我的风险代码查询中输入一个新字段,其数量取决于我确定的标准,然后我将使用它来查找风险。

我的调查表如下所示:

Name       | Location | Days spent eating IceCream | Icecream eating location
John Smith | London   | 30                         | Hull

我的风险 ID 表如下所示:

RiskID | RiskBool | Description 
1      | Yes      | At risk -  This person eats too much icecream
2      | Yes      | Risk - This person does not eat enough icecream
3      | No       | Sensible amount of icecream eaten
4      | Yes      | It is illegal to eat icecream in Hull

我的查询在访问设计视图中看起来像这样

Name       | Location | Risk Code | RiskID | Description

想编写 SQL将风险代码更改为 1、2、3、4(在我的实际案例中最多为15),然后我会告诉它只显示风险 ID 和代码匹配时的人员和描述。我还没有写这个。

实现这一目标的最佳方法是什么?

我看到两种可能性:

  1. 为每个风险 ID设置15 个查询,将描述添加到这些查询中,然后将这 15 组结果连接在一起。这是我知道该怎么做,但最终可能会很混乱。
  2. 使用语句设置一些“检查” if,然后设置该条目的风险代码字段。

我当前的 SQL 看起来像这样,但它还没有进行任何检查,我担心 if 语句会非常非常长。

SELECT DISTINCT 
[At Risk Employee List].Employee AS Name, 
[At Risk Employee List].[DaysIceCream] AS [Days spent eating Icecream], 
[At Risk Employee List].[Base Location],

     [RiskCode] AS [Risk Code], <----is this  where the check would need to go?

RiskDescLookup.RiskBoolean, 
RiskDescLookup.RiskExplanation
FROM RiskDescLookup, 
[Survey Raw Data] 
INNER JOIN 
[At Risk Employee List]
 ON 
[Survey Raw Data].ResID = [At Risk Employee List].[Staff ID]
GROUP BY 
[At Risk Employee List].Employee, 
[At Risk Employee List].[DaysIceCream],
[At Risk Employee List].[Base Location],
RiskDescLookup.RiskID,

     [RiskCode] AS [Risk Code],  <----is this  where the check would need to go?

RiskDescLookup.RiskBoolean, 
RiskDescLookup.RiskExplanation

我想象语句所做的检查if很长,看起来像(在伪代码中):

if ( [At Risk Employee List].[Base Location] = Hull, then [RiskCode]=4...., else if (DaysIceCream>42) then....

这是最好的方法吗?我什至需要有风险代码吗?

对于如何以最佳方式生成此“检查”,我有点迷茫。

4

2 回答 2

1

我不完全确定您的意图,但从您发布的内容和后续评论来看,一旦您为每个调查结果确定了风险代码,将风险代码加入风险 ID 的过程似乎相对简单。

真正的问题似乎是如何封装逻辑以识别每个调查结果的风险代码。我建议在您的查询外部“计算”每个调查结果的风险代码值,然后在最终加入风险 ID 之前加入这些结果。

例如,我可能会在SurveyRisk包含Name和的设计中添加第三个表Risk Code

使用您需要使用的任何标准和逻辑来识别每个调查响应的风险。将这些值输入到SurveyRisk表中。然后,您可以简单地加入SurveytoSurveyRiskRisk总结您的结果。

随时澄清我在哪里误解了你想要完成的事情,我会相应地编辑我的帖子。

于 2012-08-29T13:23:06.800 回答
0

最好的方法是使用模拟数据结构的查找表。

为每个“案例”添加一行,并在 MS Access 中将相应的字段链接在一起。

在此处输入图像描述

以下是一些链接:

在此处输入图像描述

然后更改 SQL 以配对需要一起使用的任何选项。例如,我所做的每项检查都针对两个单独的位置重复。

这是一个例子:

FROM RiskDescLookupReg
 INNER JOIN ([Survey Raw Data]
 INNER JOIN [At Risk Employee List]
 ON [Survey Raw Data].ResID=[At Risk Employee List].[Staff ID])
 ON (RiskDescLookupReg.RegTravelChoice=[Survey Raw Data].RegTravelChoice)

 And (RiskDescLookupReg.MonthChoice2=[Survey Raw Data].MonthChoice2
 And RiskDescLookupReg.PercentageTimeChoice2=[Survey Raw Data].PercentageTimeChoice2
 And RiskDescLookupReg.LimitedDurationChoice2=[Survey Raw Data].LimitedDurationChoice2
 And RiskDescLookupReg.TemporaryPurposeChoice2=[Survey Raw Data].TemporaryPurposeChoice2)

 Or (
RiskDescLookupReg.MonthChoice1=[Survey Raw Data].MonthChoice1
 And RiskDescLookupReg.PercentageTimeChoice1=[Survey Raw Data].PercentageTimeChoice1
 And RiskDescLookupReg.LimitedDurationChoice1=[Survey Raw Data].LimitedDurationChoice1
 And RiskDescLookupReg.TemporaryPurposeChoice1=[Survey Raw Data].TemporaryPurposeChoice1)

不是每个位置都有两个块。如果我只有一个感兴趣的位置,我可以放弃最后一个街区。

如果由于查找表的排列方式而出现重复,则需要指定查找表中的部分包含在 aLAST中,而调查中的部分则包含在 中FIRST。这是一个例子:

SELECT 
[At Risk Employee List].Number,
 FIRST([At Risk Employee List].Employee) AS Name, 
FIRST([At Risk Employee List].[Base Location]) AS BaseLocation, 
LAST(RiskDescLookupReg.RiskBool) AS RiskBool, 
LAST(RiskDescLookupReg.RiskDesc) AS RiskDesc,

的使用LAST确保如果有人出现风险而不是风险,则仅LAST显示有风险的案例(这些条目稍后出现在该字段中)。这与显示重复项时风险优先出现的事实相反。

于 2012-08-30T08:56:47.890 回答