MS Access;计算链接值在多列

时间:2016-05-01 01:48:16

标签: sql database ms-access

我搜索了一些寻找答案的帖子,但我似乎无法找到一个解释完全解释的帖子。我觉得这应该相对简单:

我有一个婚礼数据库,其中有一个表格列出了用餐选项(tbl_Meal_Options)。例如,它有1列,有4个值:肉类,鱼类,鸡肉,素食。

第二个表格包含发出的所有邀请。因为邀请中最多可以有4位客人,每个邀请行有4个餐饮栏:“Meal_1”,“Meal_2”,“Meal_3”和“Meal_4”。这四列中的单元格链接到Meal_Options表。因此,当收到邀请时,在Meal_1 / 2/3/4中选择适当的选项作为链接到Meal_Options表的下拉列表。

我希望能够运行一个查询,显示Meal_Options表中的4个项目,然后计算在Meal_1-4列中选择每个项目的次数。

最终,我正在寻找以下内容: 鸡57 鱼24 肉39 素食14

膳食总数应与参加的总人数相等。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

(由于你从未提及过它的名字,我会在这个答案中调用第二个表 tbl_Invitations

对于规范化的数据库设计最简单的SQL查询(请参阅What are 1NF, 2NF and 3NF in database design?表示这实际上不适合问题,但我没有找到更好的方法经过快速搜索后。)

应避免在tbl_Invitations中分布超过4列的相同类型的信息(用餐选项)。相反,请创建第三个表格,其中包含两列(Invitation_IDMeal_Option,相应的主键tbl_Invitationstbl_Meal_Options),其中包含应该服务的实际膳食列表。第一列表示膳食属于哪种邀请,第二列表示需要哪种膳食选择。

现在,您只需使用该表中的SELECT Meal_Option, COUNT(*),即可在Meal_Option上进行分组。

这将是一种干净的方式,但您也可以使用当前的表格布局检索相同的信息:

SELECT m.Meal, COUNT(*) AS Orders
FROM tbl_Meal_Options AS m
LEFT JOIN (
    SELECT Meal_1 AS Meal FROM tbl_Invitations
    UNION ALL
    SELECT Meal_2 AS Meal FROM tbl_Invitations
    UNION ALL
    SELECT Meal_3 AS Meal FROM tbl_Invitations
    UNION ALL
    SELECT Meal_4 AS Meal FROM tbl_Invitations
) AS i
ON m.Meal_Option = i.Meal
GROUP BY m.Meal

(假设Meal_Optiontbl_Meal_Options中的主要列和Meal文字说明)

正如你所看到的那样,如果你想改变每次邀请的用餐次数(你可能不会,但无论如何......),这会更加精细,并且会严重缩放。