我搜索了一些寻找答案的帖子,但我似乎无法找到一个解释完全解释的帖子。我觉得这应该相对简单:
我有一个婚礼数据库,其中有一个表格列出了用餐选项(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
膳食总数应与参加的总人数相等。
非常感谢任何帮助。
答案 0 :(得分:0)
(由于你从未提及过它的名字,我会在这个答案中调用第二个表 tbl_Invitations
)
对于规范化的数据库设计最简单的SQL查询(请参阅What are 1NF, 2NF and 3NF in database design?表示这实际上不适合问题,但我没有找到更好的方法经过快速搜索后。)
应避免在tbl_Invitations
中分布超过4列的相同类型的信息(用餐选项)。相反,请创建第三个表格,其中包含两列(Invitation_ID
和Meal_Option
,相应的主键tbl_Invitations
和tbl_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_Option
是tbl_Meal_Options
中的主要列和Meal
文字说明)
正如你所看到的那样,如果你想改变每次邀请的用餐次数(你可能不会,但无论如何......),这会更加精细,并且会严重缩放。