2013-06-26 9 views
7

Używam programu SQL Server 2008 R2 i Crystal Reports XISort Order na kolumnie z wielu miejsc po przecinku

mam pole, które jest typu nvarchar

zawiera treść książki więc dane jest jak

1 
3.3 
1.1 
4.5.6 
1.4.3.1.1 
11.2 
.... 

jak bym porządek na tej kolumnie tak, że pojawia się w raporcie jako

1 
1.1 
1.4.3.1.1 
3.3 
4.5.6 
11.2 
... 
+0

Spróbuj wprowadzić skalarną funkcję CLR ... Możesz znaleźć jedną możliwą implementację ** [tutaj] (http://stackoverflow.com/questions/34509/natural-human-alpha-numeric-sort-in- microsoft-sql-2005) **. –

Odpowiedz

1

Jeśli znasz maksymalną liczbę miejsc po przecinku, możesz podzielić łańcuch na części i posortować je osobno. Na przykład, jeśli wiesz, że masz maksymalnie 4 miejsca po przecinku (oddzielając 5 różnych liczb), możesz utworzyć 5 formuł, z których każdy reprezentuje kawałek ciągu.

//Formula {@Num1} to isolate most significant number 
local stringvar array splitString := split({table.string},'.'); 
if isnumeric(splitString[1]) then tonumber(splitString[1]) else 0 

//...and the formula {@Num2} for second most significant number 
local stringvar array splitString := split({table.string},'.'); 
if ubound(splitString)>1 and isnumeric(splitString[2]) 
    then tonumber(splitString[2]) else 0 

Teraz sortować raport najpierw {@Num1} a następnie przez {@Num2} itp

+0

Dzięki za odpowiedź - to byłoby idealne, ale liczba miejsc dziesiętnych nie jest ustalona. – SamB

+0

Liczba miejsc po przecinku nie musi być ustalona, ​​wystarczy znać maksymalną liczbę miejsc po przecinku. Jeśli miejsca dziesiętne nie istnieją dla konkretnego wiersza, użyj wartości 0, a będzie ono nadal poprawnie sortowane. Na przykład ciąg "11.2" zostanie posortowany jako 11.2.0.0.0 – Ryan

+0

tak - właśnie to miałem na myśli (przepraszam) ... maksymalna liczba miejsc dziesiętnych nie jest stała. Z pewnością ustawię to na wysokim poziomie (na przykład około 20), ale czy istnieje sposób, aby temu zaradzić? – SamB

3

Jest możliwe, aby posortować je w T-SQL poprzez konwersję wartości do hierarchyid:

SELECT * 
FROM (
    VALUES 
    ('1'), 
    ('3.3'), 
    ('1.1'), 
    ('4.5.6'), 
    ('1.4.3.1.1'), 
    ('11.2') 
) v (version) 
ORDER BY 
    CAST('/' + version + '/' AS hierarchyid) 
; 

proszę zobaczyć to SQL Fiddle dla demonstracji.

+0

Genialny. Zapomniałem o tym nowym typie danych 2008. –

Powiązane problemy