【问题标题】:SQL Server convert sum of column with multiple conditions into new column of same conditioned dataSQL Server将具有多个条件的列总和转换为相同条件数据的新列
【发布时间】:2018-08-22 12:53:38
【问题描述】:

我有一张高尔夫数据表。对于给定锦标赛的每一轮,每个高尔夫球手都有一个最终得分(round_score 列)。我想将每个高尔夫球手的所有回合得分相加并将其存储在 final_score 列中。我希望该 final_score 数字对于该高尔夫球手参加锦标赛的所有行都保持不变。但它为每一行产生不同的数字。

finalscore_points 列是一个公式:final_score * -3。所以我当然不希望这个数字也改变,对于给定锦标赛中的高尔夫球手的所有行。

例如:如果高尔夫球手 A 在第 1-4 轮中的 round_score 总和 = -2,那么我希望每行中的 final_score 列(按轮次、锦标赛 ID 和年份划分)将 -2 作为其值。

我该怎么做呢?

    Select player_id, full_name, [year] ,tournament_id, [round], 
    round_score, sum(round_score) as final_score, sum(round_score) * -3 as 
    finalscore_points 
    From v_temptable6
    Group By player_id, full_name, [year] ,tournament_id, [round], 
    round_score
    Order by [year], tournament_id, full_name, [round], round_score

编辑:

Sample data

【问题讨论】:

    标签: sql-server sum formula multiple-conditions


    【解决方案1】:

    为什么要对 round_score 进行分组也从 group by 子句中删除 Round Score 并在选择中添加MIN(round_score)

    Select player_id, full_name, [year] ,tournament_id, [round], MIN(round_score), sum(round_score) as final_score, sum(round_score) * -3 finalscore_points From v_temptable6 Group By player_id, full_name, [year] ,tournament_id, [round] Order by [year], tournament_id, full_name, [round], round_score

    【讨论】:

    • 因为 round_score 是一个非公式列。它是一个常规列,就像 player_id、full_name、[year]、tournament_id 和 [round]。
    • 好吧,我遇到了你的问题,尝试在同一张表上使用内部查询加入该表,该表将 player_id、tournament_id、sum(round_score) 等列输出为 final_score,sum(round_score) * -3 作为 finalscore_points 并加入这个使用 player_id,tournament_id 对主表进行内部查询,它将给出您所期望的结果
    • 试试这个SELECT T1.player_id, T1.full_name, T1.[year] , T1.tournament_id, T1.[round], T1.round_score,T2.final_score,T2.finalscore_points From v_temptable6 T1 INNER JOIN (SELECT player_id, tournament_id, sum(round_score) as final_score, sum(round_score) * -3 as finalscore_points FROM v_temptable6 Group By player_id, tournament_id) T2 ON T1.player_id = T2.player_id AND T1.tournament_id = T2.tournament_id Order by [year], tournament_id, full_name, [round], round_score
    【解决方案2】:

    您可以尝试以下查询。这里的RoundScore 是玩家每轮TournamentSUM

    SELECT   *,(RoundScore * -3) AS FinalScore 
    FROM     ( 
                SELECT   player_id, 
                        full_name, 
                        [year] , 
                        tournament_id, 
                        [round], 
                        round_score, 
                        Sum(round_score) OVER(PARTITION BY player_id,tournament_id ORDER BY player_id) AS RoundScore 
                FROM     v_temptable6 
              ) T 
    ORDER BY [year], 
             tournament_id, 
             full_name, 
             [round]
    

    示例示例

    DECLARE @TABLE TABLE(Player_Id VARCHAR(100), Full_Name VARCHAR(100), [Year] INT, tournament_id INT, Round int, Round_Score INT)
    INSERT INTO @TABLE
    SELECT 'C3CCE201-9176-4910-9916-253FCFBE7899','AB',2013,1,1,3
    INSERT INTO @TABLE
    SELECT 'C3CCE201-9176-4910-9916-253FCFBE7899','AB',2013,1,2,3    
    
    INSERT INTO @TABLE
    SELECT '51FB1D63-C925-4E69-B89B-2566271A8C8C','AC',2013,1,1,7
    
    INSERT INTO @TABLE
    SELECT '51FB1D63-C925-4E69-B89B-2566271A8C8C','AC',2013,1,2,5
    
    INSERT INTO @TABLE
    SELECT 'EE6036AF-3C74-4F34-94CE-7695473ADB04','BC',2013,1,1,-2
    
    INSERT INTO @TABLE
    SELECT 'EE6036AF-3C74-4F34-94CE-7695473ADB04','BC',2013,1,2,2
    
    INSERT INTO @TABLE
    SELECT 'EE6036AF-3C74-4F34-94CE-7695473ADB04','BC',2013,1,3,-1
    
    INSERT INTO @TABLE
    SELECT 'EE6036AF-3C74-4F34-94CE-7695473ADB04','BC',2013,1,4,7
    
    
    
    SELECT   *,(RoundScore * -3) AS FinalScore 
    FROM     ( 
                SELECT   player_id, 
                        full_name, 
                        [year] , 
                        tournament_id, 
                        [round], 
                        round_score, 
                        Sum(round_score) OVER(PARTITION BY player_id,tournament_id ORDER BY player_id) AS RoundScore 
                FROM     @TABLE 
              ) T 
    ORDER BY [year], 
             tournament_id, 
             full_name
    

    输出:

    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    | player_id                            | full_name | year | tournament_id | round | round_score | RoundScore | FinalScore |
    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    | C3CCE201-9176-4910-9916-253FCFBE7899 | AB        | 2013 | 1             | 1     | 3           | 6          | -18        |
    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    | C3CCE201-9176-4910-9916-253FCFBE7899 | AB        | 2013 | 1             | 2     | 3           | 6          | -18        |
    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    | 51FB1D63-C925-4E69-B89B-2566271A8C8C | AC        | 2013 | 1             | 1     | 7           | 12         | -36        |
    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    | 51FB1D63-C925-4E69-B89B-2566271A8C8C | AC        | 2013 | 1             | 2     | 5           | 12         | -36        |
    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    | EE6036AF-3C74-4F34-94CE-7695473ADB04 | BC        | 2013 | 1             | 1     | -2          | 6          | -18        |
    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    | EE6036AF-3C74-4F34-94CE-7695473ADB04 | BC        | 2013 | 1             | 2     | 2           | 6          | -18        |
    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    | EE6036AF-3C74-4F34-94CE-7695473ADB04 | BC        | 2013 | 1             | 3     | -1          | 6          | -18        |
    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    | EE6036AF-3C74-4F34-94CE-7695473ADB04 | BC        | 2013 | 1             | 4     | 7           | 6          | -18        |
    +--------------------------------------+-----------+------+---------------+-------+-------------+------------+------------+
    

    【讨论】:

    • 不幸的是,这不起作用。新创建的 RoundScore 列的总和不正确。
    • 能否提供一些样本数据进行检查
    • 我尝试发布我的数据图片,但图片的链接没有显示在我上面的编辑中。
    • 我已经更新了分析器,你可以检查一下,因为我在输出中没有发现任何问题。
    • 您的新代码无效。虽然我想通了。我添加了:PARTITION BY player_id、锦标赛、[年份] .... 它奏效了!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多