Sql 当特定行不存在时要处理的数据库查询
很抱歉标题不好,很难用一句话来解释我有什么问题。所以我有一个篮球统计数据库。我想做的是将一队的数据分组在一行,然后将该队与之对抗的所有数据分组在另一行。如果数据库中有对手的统计数据,那么我现在所做的就可以了,但也有可能没有对手的统计数据,而只有球队的统计数据。很难解释为什么,所以请继续 假设我有3行,如下所示:Sql 当特定行不存在时要处理的数据库查询,sql,sql-server,database,Sql,Sql Server,Database,很抱歉标题不好,很难用一句话来解释我有什么问题。所以我有一个篮球统计数据库。我想做的是将一队的数据分组在一行,然后将该队与之对抗的所有数据分组在另一行。如果数据库中有对手的统计数据,那么我现在所做的就可以了,但也有可能没有对手的统计数据,而只有球队的统计数据。很难解释为什么,所以请继续 假设我有3行,如下所示: COMP_ID | TEAM_ID | OFF_REB | DEF_REB 1 | 100 | 5 | 4 2 | 100 |
COMP_ID | TEAM_ID | OFF_REB | DEF_REB
1 | 100 | 5 | 4
2 | 100 | 1 | 1
3 | 100 | 3 | 7
基本上,有3场比赛,我只有100队的数据。我想把100队的所有篮板都排在一行,然后把对手的所有篮板都排在另一行。如果没有对手的统计数据,只要0就可以了
仅供参考-我现在做的是分组,将100队的数据打包在一起,并将对手的数据打包在一起。对于对手统计数据的团队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
当然,如果有对手的统计数据,我希望看到他们的REBS值。下面的查询将通过将union添加到结果集0来确保您有-999,并且即使您已经有-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
如果单独运行子查询,它将返回什么?在本例中,它将返回1,2,3所有3个竞争。如果将来比赛还没有开始,它可能会带来更多的比赛。所以它可能是1,2,3,4,5,6…100。你能发布一个你想看到的结果的例子吗?当然,刚刚编辑了这篇文章。它在底部。当我运行此查询时,我很接近,但是我得到了团队100的-999行的REBS值。这是指向返回结果集的工作代码的链接,如示例中所示:您是对的。我会看看我做错了什么。你的例子似乎在链接中起作用。好吧,我搞砸了。我相信你的确实管用。我和另一支球队进行了测试,他们恰好和真正的球队一样。我连续两次对一支球队进行测试,所有对手的总数都等于该队的价值。谢谢
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