Hoe bereken ek persentasies met desimale in SQL?
Vra
Hoe kan ek sit dit op 'n desimale in SQL? Hieronder is die vergelyking en ek kry die antwoord as 78 (integer) maar die werklike antwoord is 78,6 (met 'n desimale) so ek nodig het om dit te wys as anders sal die verslag sal nie klop tot 100%
(100 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
Oplossing
convert(decimal(5,2),(100 * convert(float,[TotalVisit1])/convert(float,[TotalVisits]))) AS Visit1percent
Ugly, maar dit werk.
Ander wenke
Probeer die volgende:
(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
Ten minste in MySQL (as dit help), as jy wil float getalle gebruik jy moes 'n tipe float veld, gebruik nie die gereelde int velde.
Voeg net 'n desimale om die 100
(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
Hierdie dwing almal verwerking gebeur in dryf ... as jy die finale uitset as teks wil, en kapt vir mekaar om net een desimale plek, gebruik Str funksie
Str( 100.0 * [TotalVisit1]/[TotalVisits], 4, 1 ) AS Visit1percent
CAST(ROUND([TotalVisit1]*100.0/[TotalVisits],2)as decimal(5,2)) as Percentage
Nie lelik en beter en vinnig werk, geniet dit!
Die waarskynlik overkill om dit te doen, maar jy kan wens om te oorweeg beslissende alle waardes tot dryf om akkuraatheid te verseker ten alle fases.
(100.0 * ( [TotalVisit1]+0.0 )/([TotalVisits]+0.0) ) as Visit1percent
Let wel, eintlik moet jy kode in hier vir die geval dat == 0 TotalVisits of jy sal 'n verlossing te kry deur 0 antwoord sit.
SELECT(ROUND(CAST(TotalVisit1 AS DECIMAL)/TotalVisits,1)) AS 'Visit1percent'
Dit sal 'n desimale terugkeer en die ronde sal dit rond een syfer. So in jou geval jy sou kry 76,6. As jy nie wil hê enige syfers verander die 1-0 en as jy wil twee syfers verander dit na 2.
Probeer met hierdie, geen ronde en str of oor (). Ek het gevind dat hierdie as 'n eenvoudiger manier om dit te doen.
cast((count(TotalVisit1) * 100.0) /TotalVisits as numeric(5,3)) as [Visit1percent]
Jy kan die aantal desimale punte te verander as jy wil
Bv. numeriese (5,2) of numeriese (5,4)
Dit kan nie spreek jy direk uit te reik, maar wanneer jy 'n stel getalle te rond vir die vertoning wat jy nooit gewaarborg om getalle wat voeg tot 100 tensy jy spesiale voorsorgmaatreëls te tref nie. Byvoorbeeld, afronding 33,33333, 33,33333 en 33,33333 gaan jy laat een kort op die bedrag, so die logiese ding om te doen is om die persentasie vir die grootste waarde in die stel om as gevolg van 'n verskil te neem te verander.
Hier is 'n manier om dit te doen in Oracle SQL met behulp van analitiese funksies en 'n subquery factoring (MET) klousule te monster data te genereer.
with data as (select 25 num from dual union all
select 25 from dual union all
select 25 from dual)
select num,
case
when rnk = 1
then 100 - sum(pct) over (order by rnk desc
rows between unbounded preceding
and 1 preceding)
else pct
end pct
from
(
select num,
round(100*ratio_to_report(num) over ()) pct,
row_number() over (order by num desc) rnk
from data
)
/
NUM PCT
---------------------- ----------------------
25 33
25 33
25 34
In MS Access Jy kan die SQL funksie ROUND (aantal, aantal desimale) gebruik, sal dit die aantal rond na die gegewe aantal desimale:
ROUND ((100 * [TotalVisit1] / [TotalVisits]), 1) AS Visit1percent