我对SQL很陌生并且正在追问墙壁,非常感谢任何帮助!
我在Azure中使用SQL Server。我有一个名为Votes的表,其中包含以下列:
在这里,我有多个用户对各种事件(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
但是我希望得到一个结果,我可以看到每个竞技场的所有投票摘要:
提前谢谢你们所有人!
答案 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