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]
,因此必须重复原始表达式。这在查询设计器中并不重要,它都在一列中。