【问题标题】:SQL query does not give distinct value and other issuesSQL 查询没有给出不同的值和其他问题
【发布时间】:2012-02-02 15:34:52
【问题描述】:

)

我正在做一个 SQL 查询来显示每个用户的几个用户分数的高分列表,这也应该给出特定用户达到的平均星数,以及达到的 MAX 级别,我也想进行计算用户在游戏中花费的总时间的总和,每个级别的所有时间..

我有以下问题:

1 : 我的 SQL 查询没有给每个用户一行。

2 : ginving 的总和不是每个用户,而是所有用户的总和。

3 : 平均 STARS 不以小数显示。

4 : 我无法获得“score.time_spent”来计算特定用户一直在玩的所有时间的总和

我目前的 SQL 查询如下所示:

SELECT DISTINCT
game_users.username AS 'User Name',
'Level Reached' = (SELECT DISTINCT MAX(score.game_level) FROM score
        WHERE score.game_users_id IN
        (SELECT game_users_id FROM game_users
        WHERE game_users.id = score.game_users_id)),
score.time_spent AS 'Total Time Spent',
'Stars' = (SELECT DISTINCT AVG(score.stars) FROM score
        WHERE score.game_users_id IN
        (SELECT game_users_id FROM game_users
        WHERE game_users.id = score.game_users_id)),
'High Score' = (SELECT DISTINCT SUM(score.game_level_score) FROM score
        WHERE score.game_users_id IN
        (SELECT game_users_id FROM game_users
        WHERE game_users.id = score.game_users_id)),
game_users.current_state AS 'Online State'          
FROM
game_users
INNER JOIN score ON game_users.id = score.game_users_id
GROUP BY
game_users.id,
game_users.username,
score.game_level_score,
score.game_level,
score.time_spent,
score.stars,
game_users.current_state
GO

“game_users”表如下所示:

id                      int     Unchecked
firstname       varchar(100)    Checked
lastname        varchar(100)    Checked
email           varchar(100)    Checked
username        varchar(50)     Checked
usr_pass        varchar(50)     Checked
current_state           int     Checked

“分数”表如下所示:

id                         int      Unchecked
game_users_id              int      Unchecked
game_level          varchar(4)      Checked
game_level_score    numeric(18, 0)  Checked
stars                      int      Checked
time_spent             time(7)      Checked

有人可以帮我解决这个问题吗? :-)

最好的问候

斯蒂格 :-)

【问题讨论】:

    标签: sql sum distinct


    【解决方案1】:

    尝试在子查询中进行聚合。我不确定这是否正是您所需要的,但它应该让您朝着正确的方向前进:

    SELECT  Game_Users.userName,
            MaxLevel,
            TimeSpent,
            Stars,
            HighScore,
            Game_Users.Current_State [Online State]
    FROM    game_users
            INNER JOIN
            (   SELECT  Game_users_ID, 
                        MAX(Game_Level) [MaxLevel], 
                        AVG(Stars * 1.0) [Stars], 
                        SUM(game_level_Score) [HighScore],
                        SUM(DATEDIFF(SECOND, 0, CAST(GETDATE() AS TIME))) [TimeSpent]
                FROM    Score
                GROUP BY Game_Users_ID
            ) score
                ON score.Game_Users_ID = game_users.ID
    

    【讨论】:

    • 感谢两位的回答 :-) Norla,您已经 100% 解决了所有问题,我实际上可以复制/粘贴脚本,而且效果非常棒!非常感谢 :-) /Stig :-)
    【解决方案2】:

    看起来应该可以解决它:

    SELECT a.username AS 'User Name'
        , MAX(b.game_level) AS 'Level Reached'
        , CAST(DATEADD(millisecond,SUM(DATEDIFF(millisecond,0,CAST(b.time_spent AS DATETIME))),0) AS TIME) AS 'Total Time Spent'
        , AVG(CAST(b.stars AS FLOAT)) AS 'Stars'
        , SUM(b.game_level_score) AS 'High Score'
        , a.current_state AS 'Online State'
    FROM game_users a
    JOIN score b
        ON a.id = b.game_users_id
    GROUP BY a.username, a.current_state
    

    注意:CAST 行来自该站点 - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=121027

    编辑:将星星投射为浮点数。

    【讨论】:

    • 感谢两位的回答 :-) Norla,您已经 100% 解决了所有问题,我实际上可以复制/粘贴脚本,而且效果非常棒!非常感谢 :-) /Stig :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2020-05-13
    • 2018-10-17
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多