Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取游戏计数并显示玩了一半游戏的玩家_Sql_Sql Server - Fatal编程技术网

Sql 获取游戏计数并显示玩了一半游戏的玩家

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 这就

我需要这些表中的帮助,我希望SQL语句提供以下信息:

玩了一半或更多游戏的玩家,让我们假设“游戏类型”表中有6个不同的游戏。。。所以我想显示所有玩了3场或更多游戏的玩家

比如:

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,姓氏,玩过的游戏数