Как получить в среднем до 3 знаков после запятой - PullRequest
1 голос
/ 12 мая 2011

У меня есть следующий код.3 знака после запятой отображаются, но среднее значение неверно.Есть ли способ, которым я могу реструктурировать код для достижения правильного результата?

with total_indi_days as
(
    SELECT COUNT(*) AS total, DATENAME(DW, DateLog) AS NameOfDay 
    FROM  Access 
    GROUP BY DATENAME(DW, DateLog) 
    --ORDER BY total DESC 
)
,total_overall_days as
(
    SELECT COUNT(*) as total_days FROM  Access
)
select str(((total * 100)/ total_days ), 7, 3) as average, total, total_days, NameOfDay 
from total_indi_days, total_overall_days

результат ...

|average | total | total_days | NameOfDay
| 2.000  |  29   |   1000     | Sun           
| 18.000 | 188   |   1000     | Mon             
| 15.000 | 159   |   1000     | Tues         
| 20.000 | 207   |   1000     | Wed             
| 19.000 | 194   |   1000     | Thur           
| 17.000 | 171   |   1000     | Fri             
| 5.000  |  52   |   1000     | Sat  

должен быть ...

|average | total | total_days | NameOfDay
| 2.900  |  29   |   1000     | Sun           
| 18.800 | 188   |   1000     | Mon             
| 15.900 | 159   |   1000     | Tues         
| 20.700 | 207   |   1000     | Wed             
| 19.400 | 194   |   1000     | Thur           
| 17.100 | 171   |   1000     | Fri             
| 5.200  |  52   |   1000     | Sat  

Я также хотел бы знать, есть ли более легкий способ получить этот результат.«С» немного, учитывая, что у меня есть встроенная функция AVG, которая не работала для меня, может быть, из-за того, что я поступал неправильно.

Ответы [ 5 ]

2 голосов
/ 12 мая 2011

Изменить

select str(((total * 100)/ total_days ), 7, 3) as average  to 

на

select str(((total * 100.0)/ total_days ), 7, 3) as average

Таким образом, у вас нет целочисленного деления ...

0 голосов
/ 12 мая 2011

И total, и total_days являются целыми числами, поэтому у вас неверный результат.

Это должно работать.

select CAST((total * 100.000)/ total_days AS NUMERIC(19,3)) as average, total, total_days, NameOfDay from total_indi_days, total_overall_days 
0 голосов
/ 12 мая 2011

В MySql вы можете использовать FORMAT

SELECT FORMAT(12332.1,4) => '12,332.1000'
0 голосов
/ 12 мая 2011

Похоже, проблема в том, что вы конвертируете ПОСЛЕ математики. Итак, SQL Server выполняет деление на целые числа и дает целочисленный результат, который затем преобразуется в десятичную. Попробуйте изменить 100 на 100,0, и это должно исправить проблему.

Вы также можете CAST столбцы в десятичные дроби, но как только одно из значений является десятичным, следует преобразовать остальное, чтобы дать ответ в виде десятичной дроби, и просто сделать 100 100 100 является самым простым способом сделать это.

0 голосов
/ 12 мая 2011

Вы можете использовать эту методологию, но она также округляет значение. CONVERT (Числовой (10,3), (Количество (ID) * 100. / @Total)) в процентах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...