用于处理特定行不存在时的数据库查询

时间:2012-11-08 15:56:36

标签: sql sql-server database

对于糟糕的标题,很难用一句话解释我遇到的问题。所以我有一个篮球统计数据库。我想要做的是将一个团队的统计数据分成一行,然后将该团队在另一行中所玩的所有统计数据分组。如果数据库中存在对手统计数据,我现在可以使用的是什么,但是有可能没有对手统计数据而且只有球队统计数据。很难解释原因,所以请继续使用。

所以我想说我有3行:

COMP_ID | TEAM_ID | OFF_REB | DEF_REB
  1     |  100   |   5     |    4
  2     |  100   |   1     |    1
  3     |  100   |   3     |    7

基本上,有3场比赛,我只有100队的统计数据。我想连续获得100队的所有OFF和DEF篮板,然后所有对手OFF和DEF再次反弹。如果没有对手的统计数据,那么只需0即可。

仅供参考 - 我现在所做的是将团队100的统计数据打包在一起,并将对手统计数据打包在一起。对于对手统计数据的TEAM_ID,我将它们分组为-999值,因此我知道它们是对手的值。

以下是我现在的查询:

SELECT CASE WHEN TEAM_ID <> 100 THEN -999 ELSE 100 END AS TEAM_ID, SUM(OFF_REB+DEF_REB) REBS
FROM V_STATS_COMP
WHERE COMP_ID IN (SELECT COMP_ID FROM COMPETITIONS WHERE HOME_ID = 100 OR VIS_ID = 100)
GROUP BY CASE WHEN TEAM_ID <> 100 THEN -999 ELSE 100 END
ORDER BY TEAM_ID

使用此查询,我只返回1行,那就是100号队。即使没有可用的统计数据,如何调整它以获得-999行?

编辑以显示所需的结果:

TEAM_ID | REBS
  100   |  21
 -999   |  0

当然如果有对手的统计数据,id就像看到他们的REBS值一样。

1 个答案:

答案 0 :(得分:2)

下面的查询将确保你有-999,通过为你的结果集添加0,并且即使你已经有-999,它也不会影响你的结果:

    SELECT
         TEAM_ID
        ,SUM(REBS) REBS
    FROM
        (
            SELECT 
                  CASE WHEN TEAM_ID <> 100 THEN -999 ELSE 100 END AS TEAM_ID
                , ISNULL(OFF_REB,0)+ISNULL(DEF_REB,0) REBS
            FROM 
                V_STATS_COMP
            WHERE 
                COMP_ID IN (SELECT COMP_ID FROM COMPETITIONS WHERE HOME_ID = 100 OR VIS_ID = 100)
            UNION
            SELECT -999 TEAM_ID, 0 REBS
        ) as vwStats
    GROUP BY 
        vwStats.TEAM_ID
    ORDER BY 
        vwStats.TEAM_ID DESC