用于排名/分配优先级值的访问查询

时间:2015-07-11 19:42:28

标签: sql ms-access ranking

我正在从以前没有验证规则键入的系统进行数据转换。我正在使用紧急联系人表格,并在字段空白或重复时尝试分配主要联系人(Y / N)(即某人将Y或{{ 1}}对于多个联系人我想任意分配主要)。我还将根据另一列中指定的优先级,为字母序列(Nab等)分配一个新列。

每个ID必须只有1个优先级' Y'。

当前表:

c

我想要的是什么:

+--------+---------+----------+
|   id   |  fname  | pri_cont |
+--------+---------+----------+
| 001000 | Rox     | Y        |
| 001000 | Dan     | N        |
| 001002 | May     | Y        |
| 001007 | Lee     | Y        |
| 001007 | Clive   | Y        |
| 001008 | Max     | Y        |
| 001008 | Kim     | N        |
| 001013 | Sam     | Y        |
| 001013 | Ann     |          |
| 001014 | Nat     | Y        |
| 001018 | Bruce   | Y        |
| 001018 | Mel     |          |
| 001020 | Wilson  | Y        |
| 001022 | Goi     | Y        |
| 001022 | Adele   | N        |
| 001022 | Gary    | N        |
+--------+---------+----------+

我该怎么做?

1 个答案:

答案 0 :(得分:1)

好吧,我认为你的清理需要多次查询(请注意查询假设紧急联系人表有一个唯一的自动编号,dbID):

一个选择查询来计算Y和N个实例。此外,查询可以使用Chr ASCII conversion数字到字母计算优先级列。:

SELECT t1.ID, t1.fname, t1.pri_cont, 

     (SELECT Count(*) 
      FROM EmergContacts t2 
      WHERE t1.dbID >= t2.dbID AND t1.ID = t2.ID 
        AND t1.pri_cont = t2.pri_cont AND t1.pri_cont = 'Y') AS YCount, 

     (SELECT Count(*) 
      FROM EmergContacts t3 
      WHERE t1.dbID >= t3.dbID AND t1.ID = t3.ID 
        AND t1.pri_cont = t3.pri_cont AND t1.pri_cont = 'N') AS NCount,

     (SELECT Chr(Count(t2.ID) + 96) 
      FROM EmergContacts t2 
      WHERE t1.dbID >= t2.dbID AND t1.ID = t2.ID) AS Priority

FROM EmergContacts AS t1;

输出如下:

ID   |  fname    |  pri_cont |  YCount | NCount | Priority
1000 |  Rox      |  Y        |  1      | 0      | a
1000 |  Dan      |  N        |  0      | 1      | b
1002 |  May      |  Y        |  1      | 0      | a
1007 |  Lee      |  Y        |  1      | 0      | a
1007 |  Clive    |  Y        |  2      | 1      | b
1008 |  Max      |  Y        |  1      | 0      | a
1008 |  Kim      |  N        |  0      | 1      | b
1013 |  Sam      |  Y        |  1      | 0      | a
1013 |  Ann      |           |  0      | 1      | b
1014 |  Nat      |  Y        |  1      | 0      | a
1018 |  Bruce    |  Y        |  1      | 0      | a
1018 |  Mel      |           |  0      | 1      | b
1020 |  Wilson   |  Y        |  1      | 0      | a
1022 |  Goi      |  Y        |  1      | 0      | a
1022 |  Adele    |  N        |  0      | 1      | b
1022 |  Gary     |  N        |  0      | 2      | c

从那里你运行三个更新查询:

清理Nulls:

UPDATE EmergContacts 
SET pri_cont = 'N'
WHERE pri_cont Is Null;

清理超过1个Y的ID:

UPDATE EmergContacts 
SET pri_cont = 'N'
WHERE ID IN (SELECT ID FROM EmergContPrCount WHERE YCount > 1)
  AND fName IN (SELECT fName FROM EmergContPrCount WHERE YCount > 1);

清理没有Y的ID:

UPDATE EmergContacts 
SET pri_cont = 'Y'
WHERE (ID IN (SELECT ID FROM EmergContPrCount WHERE YCount = 0)
  AND fName IN (SELECT Max(fName) FROM EmergContPrCount WHERE YCount = 0));