Десятичный вывод MySql

Вечер

У меня есть спортивная таблица, которая упорядочена по проценту успеха ((выигранные игры + (выигранные игры/2)/сыгранные игры), после вывода я вывожу, что если выиграно 100% игр, то это читается как 1.000, 75 %, затем 0,750, 50% как 0,500 и т. д. (с опущенным начальным 0).

В настоящее время я могу заставить его отображать от 0,000 до 0,950, и если команда сыграла только 1 матч и выиграла, то на выходе отображается 0,100.

Как я могу: а) заставить его показывать 1 сыгранный/выигранный матч как 1.000 б) показывать и другие комбинации в процентах, например 0,500

Есть идеи?

Спасибо

SELECT team
     , COUNT(*) as played
     , SUM(win) as wins
     , SUM(loss) as lost
     , SUM(draw) as draws
     , SUM(SelfScore) as ptsfor
     , SUM(OpponentScore) as ptsagainst
     , SUM((win*2 + draw)- loss) as score
     , CAST(SUM(win + (draw/2))/(count(*)) as decimal(3,3)) pctWon
FROM (
      SELECT team
     , SelfScore
     , OpponentScore
     , SelfScore > OpponentScore win
     , SelfScore < OpponentScore loss
     , SelfScore = OpponentScore draw
      FROM (
        SELECT HomeTeam team, HomeScore SelfScore, AwayScore OpponentScore
        FROM Game
        WHERE Season = '2015' and Type = 'League'
        UNION ALL 
        SELECT AwayTeam, AwayScore, HomeScore
        FROM Game
        WHERE Season = '2015' and Type = 'League'
       ) a
) b
GROUP BY team
ORDER BY pctWon DESC, score DESC, ptsagainst DESC, team ASC;
        ");

Это дает правильно выглядящую таблицу, за исключением того, что верхние 2 отображают некорректный PCT.

Team    W   L   T   PF  PA  PCT
T1      1   0   0   54  0   0.100
T2      1   0   0   44  0   0.100
T3      0   1   0   0   54  0.000
T4      0   1   0   0   44  0.000
T5      6   2   2   220 122 0.700
T6      7   3   0   247 139 0.700
T7      6   4   0   191 191 0.600
T8      4   5   1   167 201 0.450
T9      3   6   1   142 202 0.350
T10     2   8   0   193 305 0.200

Спасибо


person MongoUK    schedule 07.04.2015    source источник


Ответы (2)


DECIMAL(3,3) не дает места слева от десятичной точки. Вам нужно DECIMAL(4,3).

Какую версию MySQL вы используете? 0.100 звучит как ошибка. Но я не могу воспроизвести его на 5.6.12 с

mysql> SELECT CAST(((1+0/2)/1) AS DECIMAL(3,3));
+-----------------------------------+
| CAST(((1+0/2)/1) AS DECIMAL(3,3)) |
+-----------------------------------+
|                             0.999 |
+-----------------------------------+

Обратите внимание, что (4,3) дает вам то, что вы хотите:

mysql> SELECT CAST(((1+0/2)/1) AS DECIMAL(4,3));
+-----------------------------------+
| CAST(((1+0/2)/1) AS DECIMAL(4,3)) |
+-----------------------------------+
|                             1.000 |
+-----------------------------------+
person Rick James    schedule 08.04.2015
comment
Спасибо, Рик. Я использую до 5.5.41 на сервере в настоящее время. Слишком долго ломал голову над этим - person MongoUK; 09.04.2015

Наконец-то я исправил эту проблему!

Проблема, похоже, заключалась в СЧЁТЕ игр, сыгранных в CAST.

Вместо:

 , CAST(SUM(win + (draw/2))/(count(*)) as decimal(3,3)) pctWon

следующее дает правильный вывод:

 , CAST(SUM(win + (draw/2))/SUM(win + loss + draw) as decimal(4,3)) as pctWon
person MongoUK    schedule 02.05.2015