Ho dati similiSQL ordina per numero contenuto come stringa
Name SortOrder
-------------------
Lower 1 3
Lower 10 2
Lower 2 1
Lower 1% 6
Lower 1.5% 5
Lower 3% 4
Average 7
Upper 1 10
Upper 10 8
Upper 1% 12
Upper 1.5% 11
Average 10 /* sorted
Average Poor 11 * alphabetically
Rich 12 * only */
Min_Low10 17
Min_Low20 18
Min_Low30 19
Min_Up10 20
Min_Up20 21
Min_Up30 22
voglio aggiornare i ordinamento in modo che quando sono in ordine, esso sarà come questo
Name SortOrder
-------------------
Lower 3% 1
Lower 1.5% 2
Lower 1% 3
Lower 10 4
Lower 2 5
Lower 1 6
Min_Low30 7
Min_Low20 8
Min_Low10 9
Average 10 /* sorted
Average Poor 11 * alphabetically
Rich 12 * only */
Min_Up10 13
Min_Up20 14
Min_Up30 15
Upper 1 16
Upper 2 17
Upper 10 18
Upper 1% 19
Upper 1.5% 20
ie quei sottogruppi con una numerica dovrebbero essere ordinati in ordine ascendente o discendente (a seconda che sia inferiore o superiore) e qualsiasi altra cosa senza un valore numerico dovrebbe essere semplicemente ordinata alfabeticamente e inserita tra parentesi.
Penso di avere un gruppo per i primi caratteri di ogni sottogruppo, quindi convertire il numerico e l'ordine in base a quello. Ma mi dà un messaggio di errore quando si tenta di convertirlo: Error converting data type varchar to numeric.
SELECT * ,RowNum = CASE WHEN Name LIKE 'Lower %[%]' THEN ROW_NUMBER() over (partition by SUBSTRING(Name,1,5) ORDER By CAST(SUBSTRING(Name,7,LEN(Name)-3) as decimal) DESC) WHEN Name LIKE 'Lower %' THEN ROW_NUMBER() over (partition by SUBSTRING(Name,1,5) ORDER By SUBSTRING(Name,7,LEN(Name)) DESC) WHEN Name LIKE 'Upper %[%]' THEN (ROW_NUMBER() over (partition by SUBSTRING(Name,1,5) ORDER By SUBSTRING(Name,7,LEN(Name)-3))) WHEN Name LIKE 'Upper %' THEN (ROW_NUMBER() over (partition by SUBSTRING(Name,1,5) ORDER By SUBSTRING(Name,7,LEN(Name)))) ELSE -1 END FROM Table1 ORDER BY RowNum
Ecco l'Edit sqlfiddle
: cambiato valori di dati in quanto includono 1 e 10, che sarebbe ordinato sbagliato se sono varchars.
Puoi selezionare 'SOTTOSTRINGA (nome, 7, LEN (Nome) -3)' e vedere che cosa succede? Suppongo che non sia un decimale ... – NickyvV
No, è un varchar. ecco perché voglio farlo in un decimale – user3710760
Lo so, ma cosa significa 'SELEZIONARE SUBSTRING (Nome, 7, LEN (Nome) -3) DA Tabella1 WHERE Nome LIKE 'Lower% [%]'' return? – NickyvV