【问题标题】:Help with a pivot query帮助进行数据透视查询
【发布时间】:2011-08-16 10:37:34
【问题描述】:

我在 SQL Server 上有一个视图设置,它以这种方式输出记录

id   time       winnerId
-------------------------------
35  1313114959  1
36  1313116182  1
37  1313116397  1
38  1313116596  2
39  1313116807  1
40  1313116858  1
41  1313116908  1
42  1313117708  2
46  1313118441  1
47  1313118719  1
48  1313120938  1
49  1313123767  1
50  1313159321  3

现在,当我查询另一个表 tbl_players 时,我想获取他的 id 并计算他赢得了多少场比赛并显示在他的右侧。 tbl_player

id    name
-----------
1    jack
2    hugh
3    man    

我想要这样的结果

id    name    win
-----------------
1    jack    9
2    hugh    2
3    man     1   

必须计算总获胜次数,参考视图,我们称之为 view_winner

这样的查询怎么写?

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

    您将两个表连接在一起,并计算每个玩家的获胜者 ID 存在的次数

    select p.id, p.name, count(w.winnerid)
    from tbl_player p inner join someview w on w.winnerid = p.id
    group by p.id, p.name, w.winnerid
    

    【讨论】:

    • 应该在p.id, p.name上分组;并且质量测试是SQL中的单个=
    【解决方案2】:

    您可以将牌桌连在一起,然后group by 来计算获胜次数:

    select  p.id
    ,       p.name
    ,       count(w.winnerId)
    from    tbl_players p
    left join
            view_winner w
    on      p.id = w.winnerId
    group by
            p.id
    ,       p.name
    

    【讨论】:

      【解决方案3】:

      您不需要为该输出提供支点;

      select 
          p.id as id,
          p.name as name,
          count(*) as win
      from view_winner
          inner join tbl_player p on (p.id = winnerId)
      group by p.id, name
      order by p.id
      

      【讨论】:

      • count(*) 将为没有获胜的玩家返回 1
      • 我假设没有获胜的玩家不会出现在视图中,因此会被加入排除在外