SQL查询以显示每匹马的名称,以及它赢得和未赢得的事件数
以下是我创建的表:SQL查询以显示每匹马的名称,以及它赢得和未赢得的事件数,sql,ms-access,Sql,Ms Access,以下是我创建的表: CREATE TABLE Horse (horse_id INTEGER PRIMARY KEY, horse_name CHAR(30), horse_colour CHAR(30) horse_sire INTEGER, horse_dam INTEGER, horse_born INTEGER. horse_died INTEGER, horse_gender CHAR(2) ); CREATE TABLE Entry (horse_id INTEGER
CREATE TABLE Horse
(horse_id INTEGER PRIMARY KEY,
horse_name CHAR(30),
horse_colour CHAR(30)
horse_sire INTEGER,
horse_dam INTEGER,
horse_born INTEGER.
horse_died INTEGER,
horse_gender CHAR(2)
);
CREATE TABLE Entry
(horse_id INTEGER,
entry_place INTEGER
);
然后,我为这两个表添加了以下值:
INSERT INTO Horse (horse_id,horse_name,horse_colour,horse_sire,horse_dam,horse_born,horse_gender)
VALUES (101,'Flash','white',201,301,1990,'S');
INSERT INTO Horse (horse_id,horse_name,horse_colour,horse_sire,horse_dam,horse_born,horse_gender)
VALUES (102,'Star','brown',201,302,1991,'M');
INSERT INTO Horse (horse_id,horse_name,horse_colour,horse_sire,horse_dam,horse_born,horse_gender)
VALUES (201,'Boxer','grey',401,501,1980,'S');
INSERT INTO Horse (horse_id,horse_name,horse_colour,horse_sire,horse_dam,horse_born,horse_gender)
VALUES (301,'Daisy','white',401,502,1981,'M');
INSERT INTO Horse (horse_id,horse_name,horse_colour,horse_sire,horse_dam,horse_born,horse_died,horse_gender)
VALUES (302,'Tinkle','brown',401,501,1981,1994,'M');
INSERT INTO Horse (horse_id,horse_name,horse_colour,horse_dam,horse_born,horse_died,horse_gender)
VALUES (401,'Snowy','white',301,1976,1984,'S');
INSERT INTO Horse (horse_id,horse_name,horse_colour,horse_dam,horse_born,horse_died,horse_gender)
VALUES (501,'Bluebell','grey',301,1975,1982,'M');
INSERT INTO Horse (horse_id,horse_name,horse_colour,horse_dam,horse_born,horse_died,horse_gender)
VALUES (502,'Sally','white',301,1974,1987,'M');
INSERT INTO Entry (horse_id,entry_place)
VALUES (101,1);
INSERT INTO Entry (horse_id,entry_place)
VALUES (102,2);
INSERT INTO Entry (horse_id,entry_place)
VALUES (201,3);
INSERT INTO Entry (horse_id,entry_place)
VALUES (301,4);
INSERT INTO Entry (horse_id,entry_place)
VALUES (201,2);
INSERT INTO Entry (horse_id,entry_place)
VALUES (102,3);
INSERT INTO Entry (horse_id,entry_place)
VALUES (101,1);
INSERT INTO Entry (horse_id,entry_place)
VALUES (301,2);
INSERT INTO Entry (horse_id,entry_place)
VALUES (102,7);
INSERT INTO Entry (horse_id,entry_place)
VALUES (102,1);
INSERT INTO Entry (horse_id,entry_place)
VALUES (301,3);
问题是:
列出每匹马的名字,以及它参加的活动的数量
我被授予第一名。从未获得过第一名的马也应该被列入名单
计数为零。将列表按获胜次数降序排列。
此查询的输出应如下所示:
Horse Number of wins
Flash 2
Star 1
Bluebell 0
Boxer 0
Daisy 0
Sally 0
Snowy 0
Tinkle 0
这是我第一次尝试的内容:
SELECT DISTINCT Horse.horse_name ,COUNT(Entry.entry_place) AS [Number of Wins]
FROM Horse, Entry
WHERE Horse.horse_id = Entry.horse_id
AND entry_place =1 OR (NOT entry_place = 1)
GROUP by Horse.horse_name
ORDER BY Entry.entry_place DESC;
我收到以下错误消息:
ORDER BY clause (Entry.entry_place) conflicts with DISTINCT
Your query does not include the specified expression 'Entry.entry_place' as part of an aggregate function.
这就是我在第二次尝试中尝试的:
SELECT Horse.horse_name ,COUNT(Entry.entry_place) AS [Number of Wins]
FROM Horse, Entry
WHERE Horse.horse_id = Entry.horse_id
AND entry_place =1 OR (NOT entry_place = 1)
GROUP by Horse.horse_name
ORDER BY Entry.entry_place DESC;
我收到以下错误消息:
ORDER BY clause (Entry.entry_place) conflicts with DISTINCT
Your query does not include the specified expression 'Entry.entry_place' as part of an aggregate function.
我仍然无法找出代码中的错误在哪里。
如果提供了解决方案代码,这样我就可以根据问题的需要从查询中获得所需的输出,这将非常有用。使用它;这是最好的答案;享受它
Try this:
SELECT Horse.horse_name, SUM(CASE WHEN entry_place=1 THEN 1 ELSE 0 END) AS Wins
FROM Horse LEFT OUTER JOIN Entry
ON ( Horse.horse_id = Entry.horse_id )
GROUP by Horse.horse_name
ORDER BY Wins desc;
select distinct h.horse_name,
case
when e.entry_place='1' then sum(e.entry_place)
else '0'
end as [Number of wins]
from horse h
left join entry e on h.horse_id=e.horse_id
group by h.horse_name,e.entry_place
order by [Number of wins] desc;
使用它;这是最好的答案;享受它
select distinct h.horse_name,
case
when e.entry_place='1' then sum(e.entry_place)
else '0'
end as [Number of wins]
from horse h
left join entry e on h.horse_id=e.horse_id
group by h.horse_name,e.entry_place
order by [Number of wins] desc;
我会把这个分开
要计算胜利数,请使用子查询:
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
SELECT Horse.horse_name, Wins.CountWin
FROM Horse
LEFT JOIN
(
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
) AS Wins
ON Horse.horse_id = Wins.horse_id
要显示所有马,需要马和子查询之间的左连接:
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
SELECT Horse.horse_name, Wins.CountWin
FROM Horse
LEFT JOIN
(
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
) AS Wins
ON Horse.horse_id = Wins.horse_id
对于从未赢过的马,这将返回NULL
,而不是0
所以我们使用
Nz()
来解决这个问题。加上排序:
SELECT Horse.horse_name, Nz(Wins.CountWin, 0) AS [Number of Wins]
FROM Horse
LEFT JOIN
(
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
) AS Wins
ON Horse.horse_id = Wins.horse_id
ORDER BY Wins.CountWin DESC, Horse.horse_name ASC
@大家:请阅读问题标签。在我看来,仅仅在没有对家庭作业问题进行任何解释的情况下转储一块SQL并没有太大帮助
编辑:您可以使用
IIf()
修改Pallavi的代码进行访问。但是,虽然它比较短,但我发现它不太容易理解
SELECT
Horse.horse_name,
SUM(IIf(Entry.entry_place=1, 1, 0)) AS [Number of Wins]
FROM Horse LEFT JOIN Entry
ON Horse.horse_id = Entry.horse_id
GROUP by Horse.horse_name
ORDER BY SUM(IIf(Entry.entry_place=1, 1, 0)) DESC
(注意:未在Access中测试)我将对此进行拆分
要计算胜利数,请使用子查询:
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
SELECT Horse.horse_name, Wins.CountWin
FROM Horse
LEFT JOIN
(
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
) AS Wins
ON Horse.horse_id = Wins.horse_id
要显示所有马,需要马和子查询之间的左连接:
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
SELECT Horse.horse_name, Wins.CountWin
FROM Horse
LEFT JOIN
(
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
) AS Wins
ON Horse.horse_id = Wins.horse_id
对于从未赢过的马,这将返回NULL
,而不是0
所以我们使用
Nz()
来解决这个问题。加上排序:
SELECT Horse.horse_name, Nz(Wins.CountWin, 0) AS [Number of Wins]
FROM Horse
LEFT JOIN
(
SELECT horse_id, COUNT(*) AS CountWin
FROM Entry
WHERE entry_place = 1
GROUP BY horse_id
) AS Wins
ON Horse.horse_id = Wins.horse_id
ORDER BY Wins.CountWin DESC, Horse.horse_name ASC
@大家:请阅读问题标签。在我看来,仅仅在没有对家庭作业问题进行任何解释的情况下转储一块SQL并没有太大帮助
编辑:您可以使用
IIf()
修改Pallavi的代码进行访问。但是,虽然它比较短,但我发现它不太容易理解
SELECT
Horse.horse_name,
SUM(IIf(Entry.entry_place=1, 1, 0)) AS [Number of Wins]
FROM Horse LEFT JOIN Entry
ON Horse.horse_id = Entry.horse_id
GROUP by Horse.horse_name
ORDER BY SUM(IIf(Entry.entry_place=1, 1, 0)) DESC
(注意:未在Access中测试)查询表达式“SUM”(输入为1,然后为1,否则为0)中的语法错误(缺少运算符)。请注意,我在此处使用MS Access。您能否向op建议为什么这会对他们有所帮助?您对他们的问题做了哪些更改?查询表达式“SUM”中的语法错误(缺少运算符)(CASE WHEN entry_place=1然后1 ELSE 0 END)')。请注意,我在这里使用MS Access。您能否向op建议为什么这会对他们有所帮助?您对他们的问题做了哪些更改?查询表达式“SUM”(CASE entry_place WHEN1然后1 ELSE 0 END)中的语法错误(缺少运算符)。查询表达式“SUM”中的语法错误(缺少运算符)(CASE-entry\u-place WHEN1然后1,否则0-END)’。查询表达式“CASE-when e.entry\u-place='1'然后求和(e.entry\u-place)中的语法错误(缺少运算符)否则“0”结束。此查询肯定可以在SQL Server中工作。但是,在Microsoft Access中,此查询不太可能工作。我认为在Microsoft Access中,查询语法会有点不同。如果您查看我的标记,它是MS Access,而不是SQL Server。如果您可以在MS-Access中测试它,这将非常有用。从这开始是最好的答案,然后继续做一些明显导致语法错误的事情,然后请求UPVOUTS不是最好的计划。不过,为访问而重写它很容易。我也看到了sql标记,所以我在查询表达式“case when e.entry\u place='1'然后sum(e.entry\u place)中回答了sqlSyntax error(缺少运算符)否则“0”结束。此查询肯定可以在SQL Server中工作。但是,在Microsoft Access中,此查询不太可能工作。我认为在Microsoft Access中,查询语法会有点不同。如果您查看我的标记,它是MS Access,而不是SQL Server。如果您可以在MS-Access中测试它,这将非常有用。从这开始是最好的答案,然后继续做一些明显导致语法错误的事情,然后请求UPVOLUES不是最好的计划。不过,为访问而重写它很容易。我也看到了sql标记,所以我用sqlI回答了问题。我尝试了你的代码,它工作得很好:)。我想知道的是,是否有其他更简单的替代代码可以获得相同的结果?此代码更好:)。我只是有一个小小的疑问。我理解IIF的逻辑(Entry.Entry\u place=1)。但在那之后,当你再次添加1,0。再次添加1,0的逻辑是什么?(我认为)您不能在ORDER BY子句中使用
[Number of Wins]
,因此必须重复原始表达式。这在查询设计器中并不重要,它都在一列中。我尝试了您的代码,它工作得非常好:)。我想知道的是,有没有其他更简单的替代代码可以获得相同的结果?此代码更好:)。我只是有一个小小的疑问。我理解IIF的逻辑(Entry.Entry\u place=1)。但在那之后,当你再次添加1,0。再次添加1,0的逻辑是什么?(我认为)您不能在ORDER BY子句中使用[Number of Wins]
,因此必须重复原始表达式。这在查询设计器中并不重要,它都在一列中。