如何在sql server

时间:2017-11-15 21:20:55

标签: sql sql-server database azure

我对SQL很陌生并且正在追问墙壁,非常感谢任何帮助!

我在Azure中使用SQL Server。我有一个名为Votes的表,其中包含以下列:

  • arenaId
  • EVENTID
  • 用户id
  • 表决
  • 活性
  • A组
  • B组

在这里,我有多个用户对各种事件(eventId)进行投票,这些事件是各种竞技场(arenaId)的一部分。用户可以属于groupA中的/ both / none和groupB。投票列的值可以是0,1,2。活动列过滤掉哪些投票计数,因为每个用户只能为每个eventId投一个投票。因此,如果他们投了多张票,所有后续投票将有active=0,最新投票将有active=1

每个竞技场都会有多个与之相关的事件,但该事件对于特定领域是唯一的。

我的目标是能够计算每组竞技场的投票类型。

样本表设置:

arenaId | eventId | userId | vote | active | groupA | groupB
------------------------------------------------------------
abc123 |   123   |   5    |   0  |    1   |    0   |    0   
abc123 |   124   |   5    |   2  |    1   |    0   |    0   
abc123 |   125   |   5    |   1  |    1   |    0   |    0   
abc123 |   126   |   5    |   1  |    1   |    0   |    0   
------------------------------------------------------------
abc123 |   123   |   6    |   1  |    1   |    1   |    0   
abc123 |   124   |   6    |   1  |    1   |    1   |    0   
abc123 |   125   |   6    |   2  |    1   |    1   |    0   
abc123 |   126   |   6    |   1  |    1   |    1   |    0   
------------------------------------------------------------
abc123 |   123   |   7    |   2  |    1   |    1   |    1   
abc123 |   124   |   7    |   1  |    1   |    1   |    1   
abc123 |   125   |   7    |   2  |    1   |    1   |    1   
abc123 |   126   |   7    |   1  |    1   |    1   |    1   
------------------------------------------------------------
abc123 |   123   |   8    |   2  |    1   |    0   |    1   
abc123 |   124   |   8    |   1  |    1   |    0   |    1   
abc123 |   125   |   8    |   2  |    1   |    0   |    1   
abc123 |   126   |   8    |   2  |    1   |    0   |    1   
------------------------------------------------------------
def321 |   127   |   5    |   1  |    1   |    0   |    0   
def321 |   128   |   5    |   1  |    1   |    0   |    0   
def321 |   129   |   5    |   2  |    1   |    0   |    0   
def321 |   130   |   5    |   0  |    1   |    0   |    0   
------------------------------------------------------------
def321 |   127   |   6    |   0  |    1   |    1   |    0   
def321 |   128   |   6    |   2  |    1   |    1   |    0   
def321 |   129   |   6    |   2  |    1   |    1   |    0   
def321 |   130   |   6    |   1  |    1   |    1   |    0   
------------------------------------------------------------
def321 |   127   |   7    |   1  |    1   |    1   |    1   
def321 |   128   |   7    |   1  |    1   |    1   |    1   
def321 |   129   |   7    |   2  |    1   |    1   |    1   
def321 |   130   |   7    |   2  |    1   |    1   |    1   
------------------------------------------------------------
def321 |   127   |   8    |   2  |    1   |    0   |    1   
def321 |   128   |   8    |   2  |    1   |    0   |    1   
def321 |   129   |   8    |   2  |    1   |    0   |    1   
def321 |   130   |   8    |   2  |    1   |    0   |    1   

期望的结果:

arenaId | tVotes0 | tVotes1 | tVotes2 | aVotes0 | aVotes1 | aVotes2 | bVotes0 | bVotes1 | bVotes2
-------------------------------------------------------------------------------------------------------------
abc123  |    1    |    8    |    7    |    0    |    5    |    3    |    0    |    3    |    5
def321  |    2    |    5    |    9    |    1    |    3    |    4    |    0    |    2    |    6

tVotes是总票数,不考虑用户所在的组。因此tVotes0 =总票数为0,tVotes1 =总票数为1,{ {1}} =总票数为2. tVotes2只是属于groupA的用户投票。 aVotes只是属于groupB

的用户的投票

因此,在所需结果视图中的值,带有arenaId bVotes的行的abc123值为1表示在该竞技场中总计数为1票,值为0。 aVotes0和bVotes0为0的原因是因为投票值为0的用户不属于A组或B组。

只有当我指定了一个arenaId时,我才能得到结果,执行类似下面的查询:

tVotes0

但是我希望得到一个结果,我可以看到每个竞技场的所有投票摘要:

提前谢谢你们所有人!

1 个答案:

答案 0 :(得分:0)

GCM

您似乎更期待SELECT arenaId ,COUNT(DISTINCT eventId) as NumberOfEvents ,COUNT(CASE WHEN vote = 0 THEN 1 END) as tVotes0 ,COUNT(CASE WHEN vote = 1 THEN 1 END) as tVotes1 ,COUNT(CASE WHEN vote = 2 THEN 1 END) as tVotes2 ,COUNT(CASE WHEN vote = 0 AND groupA = 1 THEN 1 END) as aVotes0 ,COUNT(CASE WHEN vote = 1 AND groupA = 1 THEN 1 END) as aVotes1 ,COUNT(CASE WHEN vote = 2 AND groupA = 1 THEN 1 END) as aVotes2 ,COUNT(CASE WHEN vote = 0 AND groupB = 1 THEN 1 END) as aVotes0 ,COUNT(CASE WHEN vote = 1 AND groupB = 1 THEN 1 END) as aVotes1 ,COUNT(CASE WHEN vote = 2 AND groupB = 1 THEN 1 END) as aVotes2 FROM Votes WHERE active = 1 GROUP BY arenaId 数据。有几种方法可以做到这一点,但您可以使用PIVOT作为单个操作,而不是准备然后转动。

如果您确实涉及多个表,我怀疑您可以将该技术与连接一起使用。

以下是操作示例,您可以看到结果:http://rextester.com/SZGGR60834