Avatar billede ml Nybegynder
01. juli 2008 - 17:57 Der er 5 kommentarer

Returner decimal fra udregning med inner select

Jeg vil gerne regne forskellen mellem de to inner selects i procent. Problemer med følgende er at den kun returnere et helt tal, f.eks. 200 selvom det burde være 252,12.

Jeg har prøvet med CAST(xx AS float) på flere måder, men uden held.

Nogle ideer? :)

SELECT 
    Track.TrackID,
    Track.TrackName,

(
    (CAST(
        (
            ISNULL((SELECT SUM(TrackStatistics.UniquePlays + TrackStatistics.UniqueDownloads)
                FROM TrackStatistics
                WHERE TrackStatistics.TrackID = Track.TrackID
                AND DATEDIFF(dd, @StatDate, TrackStatistics.StatisticsDate) BETWEEN 1 AND 7), 0)
        -
            ISNULL((SELECT SUM(TrackStatistics.UniquePlays + TrackStatistics.UniqueDownloads)
                FROM TrackStatistics
                WHERE TrackStatistics.TrackID = Track.TrackID
                AND DATEDIFF(dd, @StatDate, TrackStatistics.StatisticsDate) BETWEEN 8 AND 14), 0)
        )

        /
            NULLIF((SELECT SUM(TrackStatistics.UniquePlays + TrackStatistics.UniqueDownloads)
                FROM TrackStatistics
                WHERE TrackStatistics.TrackID = Track.TrackID
                AND DATEDIFF(dd, @StatDate, TrackStatistics.StatisticsDate) BETWEEN 8 AND 14), 0)

    AS float))
    * 100
) AS ChangePct

FROM       
    Track

WHERE   
    Track.Active = 1

ORDER BY
    ChangePctDESC
Avatar billede aaberg Nybegynder
01. juli 2008 - 21:28 #1
Prøv at caste dine tal før du dividere.

SELECT
    Track.TrackID,
    Track.TrackName,

(
    (
        (
            cast(ISNULL((SELECT SUM(TrackStatistics.UniquePlays + TrackStatistics.UniqueDownloads)
                FROM TrackStatistics
                WHERE TrackStatistics.TrackID = Track.TrackID
                AND DATEDIFF(dd, @StatDate, TrackStatistics.StatisticsDate) BETWEEN 1 AND 7), 0) as float)
        -
            cast(ISNULL((SELECT SUM(TrackStatistics.UniquePlays + TrackStatistics.UniqueDownloads)
                FROM TrackStatistics
                WHERE TrackStatistics.TrackID = Track.TrackID
                AND DATEDIFF(dd, @StatDate, TrackStatistics.StatisticsDate) BETWEEN 8 AND 14), 0) as float)
        )

        /
            cast(NULLIF((SELECT SUM(TrackStatistics.UniquePlays + TrackStatistics.UniqueDownloads)
                FROM TrackStatistics
                WHERE TrackStatistics.TrackID = Track.TrackID
                AND DATEDIFF(dd, @StatDate, TrackStatistics.StatisticsDate) BETWEEN 8 AND 14), 0) as float)

    )
    * cast(100 as float)
) AS ChangePct

FROM     
    Track

WHERE 
    Track.Active = 1

ORDER BY
    ChangePctDESC
Avatar billede ml Nybegynder
02. juli 2008 - 10:00 #2
Virker desværre ikke. Har prøvet at caste stort set alt til float...
Avatar billede ml Nybegynder
02. juli 2008 - 10:17 #3
Min fejl! Det virker faktisk hvis man blot castede de enkelte tal - de første mange records gav blot et rundt tal.

cast(100 as float) er ikke nødvendigt.

Points?
Avatar billede aaberg Nybegynder
02. juli 2008 - 10:28 #4
Hjalp min post dig til at komme frem til løsningen?

Hvis ikke, bare afvis mit svar :-)
Avatar billede aaberg Nybegynder
22. juli 2008 - 13:26 #5
Tid til at lukke?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester