强制修剪查询输出值并添加自动编号


Force trim of query output values and add auto number

我有下面的SQL查询,它给了我正确的输出,但当值在网站上显示时,它们没有正确显示,我需要一些如何强制它正确显示。数据库运行在MS SQL 2008 R2上,服务器端语言为PHP。

SQL查询是:

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

我想要实现的目标

1:是否可以修剪"花费的总时间",使其仅显示HH:MM:SS?

2:是否可以强制"星号"仅为小数点后1位(因此显示3.5)?当它从我用来将其发布到web的MSSQLPHP生成器中显示时,它显示为3.5000。

3:同样,对于"高分",当值为3565时,它显示为3565.0000,这是完全错误的,应该像3565一样显示。

4:是否可以制作一个计数器,在最高排名上设置1,在下一位设置2,在第三位设置3,依此类推,以便得分最高的人在第一行显示排名1?

我知道只有"花费的总时间"具有额外的格式,这是我在MS SQL Management Studio中运行查询时应该具有的格式,但我询问2和3的原因是,是否有某种方法可以强制Web代码从查询内部正确显示它?

致以最诚挚的问候

Stig:-)

最好在PHP端进行格式化,但您的问题似乎是希望在SQL端进行格式化。所以,试试这个:

SELECT ROW_NUMBER() OVER(ORDER BY SUM(b.game_level_score) DESC) AS 'Rank'
    , a.username AS 'User Name'
    , MAX(b.game_level) AS 'Level Reached'
    , Convert(VarChar(8), DATEADD(millisecond,SUM(DATEDIFF(millisecond,0,CAST(b.time_spent AS DATETIME))),0), 108) AS 'Total Time Spent'
    , Cast(Cast(Round(AVG(Cast(b.stars AS Float)),1) AS Numeric(25,1)) AS VarChar(25)) AS 'Stars' 
    , Cast(SUM(b.game_level_score) AS Int) 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

我把星号铸造成varchar(四舍五入到一个小数点后),因为这是让PHP保持一个小数的唯一方法。我把另一个数值(高分)留作int。PHP我应该留作int,不显示额外的小数点,但如果显示了,你也必须转换为varchar。

一切都应该正常,但由于我没有你们的表,我无法测试过去的有效语法。你需要这样做。。。请将此代码示例视为一个指南,让您接近它。

Row_Number()OVER排序可能需要朝另一个方向进行,具体取决于您的偏好。根据需要更改为DESC或ASC。