Sql 获取游戏计数并显示玩了一半游戏的玩家
我需要这些表中的帮助,我希望SQL语句提供以下信息: 玩了一半或更多游戏的玩家,让我们假设“游戏类型”表中有6个不同的游戏。。。所以我想显示所有玩了3场或更多游戏的玩家 比如:Sql 获取游戏计数并显示玩了一半游戏的玩家,sql,sql-server,Sql,Sql Server,我需要这些表中的帮助,我希望SQL语句提供以下信息: 玩了一半或更多游戏的玩家,让我们假设“游戏类型”表中有6个不同的游戏。。。所以我想显示所有玩了3场或更多游戏的玩家 比如: ID surName number of games played 1 test1 3 2 test2 4 3 test3 3 4 test4 6 这就
ID surName number of games played
1 test1 3
2 test2 4
3 test3 3
4 test4 6
这就是我到目前为止所做的:
SELECT dbo.Player.ID, dbo.Player.surName, count(DISTINCT
dbo.PlayerInAGame.gameTypeName) AS games_played, count(DISTINCT
dbo.Game.gameTypeName) AS games_count
FROM dbo.Player INNER JOIN
dbo.PlayerInAGame ON dbo.Player.ID =
dbo.PlayerInAGame.playerID INNER JOIN
dbo.Game ON dbo.PlayerInAGame.gameTypeName = dbo.Game.gameTypeName AND
dbo.PlayerInAGame.gameDateTime = dbo.Game.gameStartDateTime
GROUP BY dbo.Player.ID, dbo.Player.surName, dbo.Game.DealerInGame
以下是表格:
create table Dealer
(
number int identity(1000,1) primary key,
firstName nvarchar(20) not null,
surName nvarchar(20) not null,
birthDate date not null,
startWorkingDate date not null,
ID char(9) check(ID like replicate('[0-9]',9)) not null unique,
check(datediff(year,birthDate,startWorkingDate)>=24)
)
create table GameType
(
name nvarchar(20) primary key,
description nvarchar(20) not null,
minimumPlayers tinyint check (minimumPlayers > 0) not null,
maximumPlayers tinyint check (maximumPlayers > 0) not null,
check(minimumPlayers <= maximumPlayers)
)
create table Game
(
gameTypeName nvarchar(20) references GameType(name) on delete cascade,
gameStartDateTime datetime,
gameEndTime time,
DealerInGame int not null references Dealer(number),
primary key(gameTypeName,gameStartDateTime)
)
create table Player
(
ID char(9) primary key,
firstName nvarchar(20) not null,
surName nvarchar(20) not null,
city nvarchar(20) not null,
birthDate date check(datediff(year,birthDate,getdate())>=18) not null,
preferred nvarchar(20) references GameType(name) on delete set null
)
create table PlayerInAGame
(
playerID char(9) references Player(ID),
gameTypeName nvarchar(20),
gameDateTime datetime,
betAmount int check(betAmount>0) not null,
winLosAmount int,
check((winLosAmount = -betAmount) or (winLosAmount>=betAmount)),
foreign key(gameTypeName,gameDateTime) references
Game(gameTypeName,gameStartDateTime), primary
key(playerID,gameTypeName,gameDateTime) )
create table PlayerDealerRelation
(
dealerNumber int references Dealer(number) on delete cascade,
playerID char(9) references Player(ID),
relationType char(1) check(relationType in ('P','G','B','C','U','N')),
primary key(dealerNumber,playerID)
)
创建表经销商
(
数字int标识(1000,1)主键,
firstName nvarchar(20)不为空,
姓氏nvarchar(20)不为空,
生日日期不为空,
startWorkingDate日期不为空,
ID char(9)检查(类似ID的复制('[0-9]',9))不为null唯一,
支票(datediff(年份、出生日期、开始工作日期)>=24)
)
创建表游戏类型
(
名称nvarchar(20)主键,
说明nvarchar(20)不为空,
minimumPlayers tinyint检查(minimumPlayers>0)不为空,
maximumPlayers tinyint检查(maximumPlayers>0)不为空,
检查(minimumPlayers=18)不为空,
首选nvarchar(20)在删除集null上引用游戏类型(名称)
)
创建桌面播放器名称
(
玩家ID字符(9)引用玩家ID,
游戏类型名称nvarchar(20),
gameDateTime日期时间,
betAmount整数检查(betAmount>0)不为空,
winLosAmount int,
检查((winLosAmount=-betAmount)或(winLosAmount>=betAmount)),
外键(gameTypeName、gameDateTime)引用
游戏(gameTypeName,gameStartDateTime),主要
键(playerID、gameTypeName、gameDateTime))
创建表playerDealRelation
(
dealerNumber int在删除级联时引用经销商(编号),
玩家ID字符(9)引用玩家ID,
relationType字符(1)检查(relationType输入('P','G','B','C','U','N'),
主键(dealerNumber,playerID)
)
如果您在问题中的查询给出了正确的计数,那么很容易添加一个额外的过滤器,只留下那些游戏数
超过游戏数
一半的行
只需添加具有的:
SELECT
dbo.Player.ID,
dbo.Player.surName,
count(DISTINCT dbo.PlayerInAGame.gameTypeName) AS games_played,
count(DISTINCT dbo.Game.gameTypeName) AS games_count
FROM
dbo.Player
INNER JOIN dbo.PlayerInAGame ON dbo.Player.ID = dbo.PlayerInAGame.playerID
INNER JOIN dbo.Game
ON dbo.PlayerInAGame.gameTypeName = dbo.Game.gameTypeName
AND dbo.PlayerInAGame.gameDateTime = dbo.Game.gameStartDateTime
GROUP BY dbo.Player.ID, dbo.Player.surName, dbo.Game.DealerInGame
HAVING
count(DISTINCT dbo.PlayerInAGame.gameTypeName) >
count(DISTINCT dbo.Game.gameTypeName) / 2
你的问题把我弄糊涂了。。。您想要玩过一半游戏的玩家还是玩过一半游戏类型的玩家?你想要游戏的数量还是游戏类型?如何将两者结合起来?我认为,如果你展示你已经拥有的,这也可能有助于理解这一点。@stickybit,是的,我想要“玩过一半游戏的玩家”所有玩过一半或更多游戏的玩家作为列表,ID,姓氏,玩过的游戏数