[英]How to create and join multiple derived tables in sql server
我对SQL还是很陌生,并且碰壁了,非常感谢您的帮助!
我在Azure中使用SQL Server。 我有一个名为Votes的表,该表具有以下列:
在这里,我有多个用户对各种事件(eventId)进行投票,这些事件是各个竞技场(arenaId)的一部分。 用户可以属于groupA和groupB中的一个/两者/都不属于。 投票列的值可以为0,1,2。 活动列过滤掉要计入哪个投票,因为每个用户只能为每个eventId投一票。 因此,如果他们投了多个票,那么所有后续投票将都active=0
,而最新的投票将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 =总票数, tVotes2
=值2的总票数aVotes
只是通过用户的选票属于groupA的人。 bVotes
只是属于groupB的用户的票
因此,在所需结果视图中,具有arenaId abc123
的行的tVotes0值为1,表示该区tVotes0
的投票总数为1票,值为0。 aVotes0和bVotes0为0的原因是,以0进行投票的用户既不是组A也不是组B的一部分。
只有指定arenaId才能获得结果,并且执行类似以下查询的操作:
SELECT (
SELECT COUNT(eventId) AS voteCount
FROM (
SELECT eventId
FROM Votes
WHERE arenaId = 'abc123'
AND active = 1
AND vote = 1
AND groupA = 1
GROUP BY userId, eventId
) AS t1
) AS aVotes1
但是我想得到一个结果,我可以看到每个球馆的所有投票摘要:
提前非常感谢大家!
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
。 您可以通过几种方法来执行此操作,但无需准备然后进行CONDITIONAL AGGREGATION
操作,就可以使用CONDITIONAL AGGREGATION
进行单个操作。
如果您怀疑实际上涉及多个表,则可以将其与联接一起使用。
这是实际操作中的示例,因此您可以看到结果: http : //rextester.com/SZGGR60834
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.