At a guess - but I've seen this so often it's not funny - it is in order, but your DB design is faulty.
I think you have voucher_no as a NVARCHAR or VARCHAR column, so the ORDER BY clause will use a string comparison instead of a numeric one. And in a string comparison, the ordering is done based on the first different character:
1
10
100
11
12
...
2
20
21
If you want a numeric order, then store numeric values in a numeric field, not string.