我有下表,我想在计数列中用 0 填充缺失的分组。 我不知道分数列中缺少哪些值,但知道可能的值(老鹰、小鸟、标准杆、柏忌、德柏忌)。 在 R/Tidy 中,我可以使用
factor()
和 complete()
来填补缺失的配对。 在 SQL Server 中是否有等效的方法来执行此操作?
玩家 | 分数 | 数 |
---|---|---|
P1 | 标准杆 | 4 |
P1 | 柏忌 | 14 |
P2 | 小鸟 | 3 |
P2 | 标准杆 | 14 |
P2 | dbogy | 1 |
所需输出
玩家 | 分数 | 数 |
---|---|---|
P1 | 鹰 | 0 |
P1 | 小鸟 | 0 |
P1 | 标准杆 | 4 |
P1 | 柏忌 | 14 |
P1 | dbogy | 0 |
P2 | 鹰 | 0 |
P2 | 小鸟 | 3 |
P2 | 标准杆 | 14 |
P2 | 柏忌 | 0 |
P2 | dbogy | 1 |
我猜有很多方法,但通常所有解决方案都意味着您需要对可用数据和所有不同的组合进行某种交叉连接。
一个想法:
SELECT *
INTO #data
FROM (
VALUES (N'P1', N'par', 4)
, (N'P1', N'bogey', 14)
, (N'P2', N'birdie', 3)
, (N'P2', N'par', 14)
, (N'P2', N'dbogey', 1)
) t (player,score,count)
SELECT d.player, x.score, MAX(x.count) AS count
FROM #data d
CROSS apply (
SELECT score, count
UNION ALL
SELECT all_scores.score, 0
FROM (
VALUES ('eagle'), ('bird'), ('par'), ('bogey'), ('dbogey')
) all_scores (score)
) x
GROUP BY d.player, x.score
在这里,我们获取玩家表,然后使用 CROSS APPLY 创建可用分数和计数为 0 的“all_scores”的组合。
然后,通过汇总分数,我们获取实际数据并用虚拟数据补充缺失的分数。
最终输出:
玩家 | 分数 | 数 |
---|---|---|
P1 | 鸟 | 0 |
P2 | 鸟 | 0 |
P2 | 小鸟 | 3 |
P1 | 柏忌 | 14 |
P2 | 柏忌 | 0 |
P1 | dbogy | 0 |
P2 | dbogy | 1 |
P1 | 鹰 | 0 |
P2 | 鹰 | 0 |
P1 | 标准杆 | 4 |
P2 | 标准杆 | 14 |