Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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_Database - Fatal编程技术网

Sql 按行组合选择计数

Sql 按行组合选择计数,sql,sql-server,database,Sql,Sql Server,Database,我正在为乍一看似乎是简单的SQL查询而苦苦挣扎:) 下面的表有三列:PlayerId、Gender、Result(都是integer类型) 我想做的是,选择不同性别的球员2(男性),每个结果的数量。 大约有50个可能的结果,因此新表应该有51列: |玩家ID | 1 | 2 | 3 |……|五十| 所以,我想看看每个男性(性别2)运动员获得特定结果的次数 ***以防你们还不完全清楚这个问题:在每一场比赛后,我插入一行,其中有玩家ID、性别和在该游戏中获得的结果(1-50)。现在我想看看每个玩家取

我正在为乍一看似乎是简单的SQL查询而苦苦挣扎:)

下面的表有三列:PlayerId、Gender、Result(都是integer类型)

我想做的是,选择不同性别的球员2(男性),每个结果的数量。 大约有50个可能的结果,因此新表应该有51列:

|玩家ID | 1 | 2 | 3 |……|五十|

所以,我想看看每个男性(性别2)运动员获得特定结果的次数

***以防你们还不完全清楚这个问题:在每一场比赛后,我插入一行,其中有玩家ID、性别和在该游戏中获得的结果(1-50)。现在我想看看每个玩家取得特定成绩的次数。

试试看

select PleyerId from tablename where result = 'specific result you want' and gender = 2 group by PleyerId
试一试


如果有50个结果,并且您希望它们列在列中,那么您谈论的是枢轴。我倾向于使用条件聚合来执行这些操作:

select player,
       sum(case when result = 0 then 1 else 0 end) as result_00,
       sum(case when result = 1 then 1 else 0 end) as result_01,
       . . .
       sum(case when result = 50 then 1 else 0 end) as result_50
from t
group by player;

如果愿意,您可以使用
选择特定的性别,其中性别=2
。但是为什么不同时计算所有结果呢?

如果有50个结果,并且您希望它们列在列中,那么您所说的是轴心。我倾向于使用条件聚合来执行这些操作:

select player,
       sum(case when result = 0 then 1 else 0 end) as result_00,
       sum(case when result = 1 then 1 else 0 end) as result_01,
       . . .
       sum(case when result = 50 then 1 else 0 end) as result_50
from t
group by player;

如果愿意,您可以使用
选择特定的性别,其中性别=2
。但是为什么不同时计算所有数据呢?

最简单的方法是使用旋转:

;with cte as(Select * from t
             Where gender = 2)
Select * from cte
Pivot(count(gender) for result in([1],[2],[3],....,[50]))p
拨弄


注意:在分数表中保留性别是个坏主意。最好为玩家单独制作一张桌子,并保留性别。

最简单的方法是使用旋转:

;with cte as(Select * from t
             Where gender = 2)
Select * from cte
Pivot(count(gender) for result in([1],[2],[3],....,[50]))p
拨弄


注意:在分数表中保留性别是个坏主意。最好为玩家单独制作一张表,并保留性别。

非常感谢,这正是我所需要的,但我不得不用“选择玩家”替换“选择性别”,用“按玩家分组”替换“按性别分组”,以得到我最初想要的。我并不是同时计算所有数据,因为我的主表中有2亿cca,我假设限制特定的性别会更快(我想过滤的性别是所有行的10%),非常感谢,这正是我所需要的,但我不得不用“选择玩家”替换“选择性别”,用“按玩家分组”替换“按性别分组”得到我最初想要的东西。我不是同时计算所有数据,因为我的主表中有2亿cca,我假设限制特定性别会更快(我要筛选的性别占所有行的10%)