Принудительно обрезать выходные значения запроса и добавить автоматический номер - PullRequest
1 голос
/ 03 февраля 2012

У меня есть приведенный ниже 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: Можно ли обрезать «Общее время нахождения», чтобы отображалось только ЧЧ: ММ: СС?

2: Можно ли заставить «Звезды» быть только 1 десятичной дробью (то есть отображается 3,5)? Когда он отображается из MS SQL PHP Generator, который я использую для публикации в Интернете, он отображается как 3.5000.

3: Также для «High Score», когда значение равно 3565, вместо этого оно отображается как 3565.0000, что неверно и должно отображаться так же, как 3565.

4: возможно ли создать счетчик, который устанавливает 1 на самый высокий ранг, 2 на следующий, 3 на третий и т. Д., Чтобы человек с наивысшим баллом получил ранг 1, отображаемый в первой строке?

Я знаю, что только «Общее время нахождения» имеет дополнительное форматирование, которое должно быть при запуске запроса в MS SQL Management Studio, но я спрашиваю о 2 и 3, если есть какой-то способ заставить веб-код правильно отображать его из запроса?

С наилучшими пожеланиями

Стиг: -)

1 Ответ

0 голосов
/ 04 февраля 2012

Возможно, было бы лучше выполнить форматирование на стороне 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 в соответствии с вашими потребностями.

...