计算列-SQL-足球队

计算列-SQL-足球队,sql,sql-server,calculated-columns,Sql,Sql Server,Calculated Columns,我想在代表英超(英国)足球排名的“球队”表中添加一个新的第二列。目前,该表仅包含每个足球队的名称 该栏将被称为“已玩”,它将列出每个队玩过的游戏数。我想从一个名为“games”的单独表中计算这个数字(整数数据类型),该表记录了游戏装置的历史日志。这可能包括使用SQL的本机“COUNT”函数 我已尝试使用函数来帮助我执行此操作,但目前它正在将所有值作为“0”插入 CREATE FUNCTION [dbo].[GetPlayed](@Team VARCHAR) RETURNS INT BEGIN

我想在代表英超(英国)足球排名的“球队”表中添加一个新的第二列。目前,该表仅包含每个足球队的名称

该栏将被称为“已玩”,它将列出每个队玩过的游戏数。我想从一个名为“games”的单独表中计算这个数字(整数数据类型),该表记录了游戏装置的历史日志。这可能包括使用SQL的本机“COUNT”函数

我已尝试使用函数来帮助我执行此操作,但目前它正在将所有值作为“0”插入

CREATE FUNCTION [dbo].[GetPlayed](@Team VARCHAR)
RETURNS INT
BEGIN
   RETURN(SELECT COUNT(*)
   FROM games
   WHERE games.Home = @Team OR games.Away = @Team);
END;

ALTER TABLE teams
ADD Played AS GetPlayed(teams.Team)
各表:

小组:

```Team
Arsenal
Bournemouth
Burnley
Chelsea
Crystal Palace
Everton
Hull City
Leicester City
Liverpool
Manchester City
Manchester United
Middlesbrough
Southampton
Stoke City
Sunderland
Swansea City
Tottenham Hotspur
Wat"For"d
West Bromwich Albion
West Ham United
```
游戏:

gameID  Home    HomeScore   Away    AwayScore   GameDate
4   Arsenal 2   Chelsea 0   2018-05-26
5   Arsenal 5   Bournemouth 0   2018-04-22
6   Arsenal 1   Leicester City  1   2018-03-15
7   Bournemouth 5   Liverpool   0   2018-04-22
8   Burnley 5   Bournemouth 0   2018-04-22
9   Burnley 1   Swansea City    2   2017-11-22
10  Stoke City  0   Burnley 0   2018-01-08
11  Chelsea 1   Middlesborough  2   2017-11-22
12  Southampton 0   Chelsea 0   2018-01-01
13  Crystal Palace  1   Everton 2   2018-03-26
14  Manchester United   4   Crystal Palace  0   2018-06-01
15  Crystal Palace  0   Southampton 1   2018-04-16
16  Everton 1   Hull City   2   2017-11-20
17  Manchester City 4   Everton 0   2017-11-20
18  Hull City   0   Burnley 0   2018-06-01
19  Sunderland  2   Hull City   0   2018-06-15
20  Leicester City  3   Tottenham Hotspur   1   2017-09-20
21  Swansea City    2   Leicester City  5   2018-02-15
22  Sunderland  0   Leicester City  1   2018-01-29
23  Liverpool   3   Tottenham Hotspur   0   2018-02-28
24  Stoke City  1   Liverpool   2   2017-09-19
25  Manchester City 2   Manchester United   4   2018-05-02
26  Middlesborough  1   Southampton 1   2018-02-08
27  Stoke City  2   Middlesborough  2   2017-08-19
28  Swansea City    0   Manchester United   5   2018-06-27
29  Sunderland  1   Tottenham Hotspur   2   2017-09-01
任何帮助都将不胜感激


谢谢,Rob无大小的VARCHAR默认为1个字符,您需要更改函数声明

CREATE FUNCTION [dbo].[GetPlayed](@Team VARCHAR(32))
.....

如果没有大小,您的参数@Team将只收到传递的团队值的第一个字母,当然,WHERE语句无法在您的游戏表中找到任何结果

我建议使用
视图
,并在其中包含列。使用
交叉应用
分组依据
返回数据,而不是
选择
语句中的函数或子查询。标量函数的性能不是最好的,而且
选择中的子查询也不是最好的,因为它们每行运行一次,而不是对数据集运行一次。是的,这是一个计算值,不是应该存储的内容。您应该在需要时计算它。没有大小的VARCHAR默认为1@Steve绝对指出了问题所在。当然,参数默认为1是正确的,但列默认为30。这就是您应该始终指定大小的原因。具体地说,声明为
varchar
的参数默认为
varchar(1)
,但是,
CAST
/
转换为
varchar
作为输入参数默认为
varchar(30)
。例如
选择CONVERT(varchar,'12345678900123456789012345678901234567890')返回
12345678900123456789012345678901234567890