The string format is ISO compliant so why not CAST it to a date type and then use the MONTH function?
To get all January sales use:

SELECT SelDate, TotalAA, TotalAG
FROM (SELECT TOP 20 SelDate, TotalAA, TotalAG
FROM History
WHERE (UserId = @UserId)
ORDER BY Datum DESC) AS derivedtbl
where MONTH(CAST(seldate as DATEITME)) = 1
ORDER BY SelDate

Your comment "I would like to select a distinct month" is potentially confusing. I think you mean that you want to filter your results to a specific month, rather than choosing the Distinct months that are returned.

Because your SelDate field is a string, you may like to pass in your month in a YYYYMM format, and use a filter like:

WHERE SelDate LIKE @Month + '%'

This will let you put an index on the SelDate field (actually, for the query provided, this index would be better).

It's worth indexing first on UserID, because you filter on that directly. Next would be SelDate, which is like the phone directory filtering next on FirstName. Unfortunately, the query wants the data in Datum order, so this other query might be preferable in some ways, as the data from the index will come back in order, just not filtered sufficiently. This second index will let the TOP be done more efficiently.