繁体   English   中英

如何在SQL Server中创建和联接多个派生表

[英]How to create and join multiple derived tables in sql server

我对SQL还是很陌生,并且碰壁了,非常感谢您的帮助!

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

  • 竞技场
  • eventId
  • 用户身份
  • 投票
  • 活性
  • 组A
  • 组B

在这里,我有多个用户对各种事件(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的行的tVot​​es0值为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM