我妈妈想为我兄弟的婴儿洗澡买一个婴儿游戏。想要学习python,我自告奋勇去做。我几乎有python位,这就是抛出我的SQL。
游戏应该起作用的方式是淋浴时每个人都在纸上写下名字,我手动将它们输入Excel(尽可能规范拼写)并导出到MS Access。然后我运行我的python程序,找到最流行名字的玩家和名字最独特的玩家。这个名为“babynames”的数据库只有四列。
ID | BabyFirstName | BabyMiddleName | PlayerName
---|---------------|----------------|-----------
我的妈妈经常改变一切,但正如他们现在所说的那样,我必须弄明白:
a)所有名字和中间名称中最流行的名字(或名称,如果有领带)
b)所有名字和中间名称中最独特的名字(或名称,如果有领带)
c)拥有最多流行名字(赢得奖品)的玩家
d)拥有最多唯一名称(赢得奖品)的玩家
我一直在研究这个问题大约一个星期,甚至不能得到a)和b)工作的SQL查询,更不用说c)和d)。我不仅仅是有点沮丧。
顺便说一句,我只是看着名字的拼写,而不是语音。当我手动输入名字时,我会将“Kris”等名称改为“Chris”,将“Xtina”改为“Christina”等。编辑以添加我尝试过的几个最新查询a)
SELECT [BabyFirstName],
COUNT ([BabyFirstName]) AS 'FirstNameOccurrence'
FROM [babynames]
GROUP BY [BabyFirstName]
ORDER BY 'FirstNameOccurrence' DESC
LIMIT 1
和
SELECT [BabyFirstName]
FROM [babynames]
GROUP BY [BabyFirstName]
HAVING COUNT(*) =
(SELECT COUNT(*)
FROM [babynames]
GROUP BY [BabyFirstName]
ORDER BY COUNT(*) DESC
LIMIT 1)
这两者都会导致语法错误。
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in ORDER BY clause. (-3508) (SQLExecDirectW)')
我尝试使用[FirstNameOccurrence]和FirstNameOccurrence以及相同的错误。不确定为什么它不能通过该列名来识别它。
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error. in query expression 'COUNT(*) = (SELECT COUNT(*) FROM [babynames] GROUP BY [BabyFirstName] ORDER BY COUNT(*) DESC LIMIT 1)'. (-3100) (SQLExecDirectW)")
我承认我在这里并没有真正学习所有的COUNT(*)命令,但这是针对stackoverflow中类似问题的解决方案,我认为当我的其他想法没有时我会尝试平底锅。
答案 0 :(得分:0)
对于A和B,在SQL中使用group by
子句,然后计数,order by
计数。使用A的降序和B的升序,只取每个的第一个结果。
对于C和D,基本上使用相同的策略,但现在只需添加PlayerName(例如group by babyname,playername
),然后使用升序/降序问题。
以下是微软对MS Access中group by
子句的撰写:https://office.microsoft.com/en-us/access-help/group-by-clause-HA001231482.aspx
这是一篇更好的文章,展示了如何同时执行group by
和order by
:http://rogersaccessblog.blogspot.com/2009/06/select-queries-part-3-sorting-and.html
答案 1 :(得分:0)
对于您尝试的第一个查询,请将其更改为:
SELECT TOP 1 [BabyFirstName],
COUNT ([BabyFirstName]) AS 'FirstNameOccurrence'
FROM [babynames]
GROUP BY [BabyFirstName]
ORDER BY 'FirstNameOccurrence' DESC
对于第二个,将其更改为:
SELECT [BabyFirstName]
FROM [babynames]
GROUP BY [BabyFirstName]
HAVING COUNT(*) =
(SELECT TOP 1 COUNT(*)
FROM [babynames]
GROUP BY [BabyFirstName]
ORDER BY COUNT(*) DESC)
通过在TOP
之后直接添加SELECT
语句来限制Access中SQL语句返回的记录数,而不是ORDER BY... LIMIT
此外,Access TOP
语句将返回前n个(或n%)唯一记录的所有实例,因此如果查询输出中有两个或更多相同的记录(在TOP之前),并且{{1如果已指定,您将全部看到它们。