我有下面的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。