SQL Server 相当于 R Tidy Factor() 和complete(),用于填充缺失的配对

问题描述 投票:0回答:1

我有下表,我想在计数列中用 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
sql sql-server
1个回答
0
投票

我猜有很多方法,但通常所有解决方案都意味着您需要对可用数据和所有不同的组合进行某种交叉连接。

一个想法:

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
© www.soinside.com 2019 - 2024. All rights reserved.