Порядок сортировки таблицы по имени и версии SQL - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть следующая таблица, table_1, которую мне нужно упорядочить по двум столбцам:

Name     |   Version   |   Age   |   Registration_Date
-----------------------------------------------
A_x      |      1      |   35    |   20/1/2019
A_y      |      1      |   12    |   20/1/2019
A_x      |      2      |   34    |   20/1/2019
A_y      |      2      |   35    |   20/1/2019
C_x      |      1      |   54    |   20/1/2019
C_y      |      1      |   65    |   20/1/2019
F_x      |      1      |   11    |   20/1/2019
F_y      |      1      |   22    |   20/1/2019
E_y      |      1      |   27    |   20/1/2019
E_x      |      1      |   89    |   20/1/2019
C_x      |      2      |   99    |   20/1/2019
C_y      |      2      |   77    |   20/1/2019

, и мне нужно отсортировать ее по имени и версии, например:

Name     |   Version   |   Age   |   Registration_Date
-----------------------------------------------
A_x      |      1      |   35    |   20/1/2019
A_y      |      1      |   12    |   20/1/2019
A_x      |      2      |   34    |   20/1/2019
A_y      |      2      |   35    |   20/1/2019
C_x      |      1      |   54    |   20/1/2019
C_y      |      1      |   65    |   20/1/2019
C_x      |      2      |   99    |   20/1/2019
C_y      |      2      |   77    |   20/1/2019
E_y      |      1      |   27    |   20/1/2019
E_x      |      1      |   89    |   20/1/2019
F_x      |      1      |   11    |   20/1/2019
F_y      |      1      |   22    |   20/1/2019

Вот что я делаю ..

SELECT * FROM table_1 order by lower(Name), Version desc;

но все равно получаю этот вывод:

Name     |   Version   |   Age   |   Registration_Date
-----------------------------------------------
A_x      |      1      |   35    |   20/1/2019
A_x      |      2      |   34    |   20/1/2019
A_y      |      1      |   12    |   20/1/2019
A_y      |      2      |   35    |   20/1/2019
C_x      |      1      |   54    |   20/1/2019
C_x      |      2      |   99    |   20/1/2019
C_y      |      1      |   65    |   20/1/2019
C_y      |      2      |   77    |   20/1/2019
E_x      |      1      |   89    |   20/1/2019
E_y      |      1      |   27    |   20/1/2019
F_x      |      1      |   11    |   20/1/2019
F_y      |      1      |   22    |   20/1/2019

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Для демонстрационных данных, которые вы разместили, необходимо сначала упорядочить по части имени до подчеркивания:

SELECT * FROM table_1 
order by lower(left(Name, charindex('_', name))), Version, lower(Name);

или, если перед подчеркиванием всегда только 1 символ:

SELECT * FROM table_1 
order by lower(left(Name, 1)), Version, lower(Name);

Я использую lower() только потому, что он есть в вашем коде. Если это не нужно, вы можете удалить его. Смотрите демо . Результаты:

> Name | Version | Age | Registration_Date
> :--- | ------: | --: | :----------------
> A_x  |       1 |  35 | 20/1/2019        
> A_y  |       1 |  12 | 20/1/2019        
> A_x  |       2 |  34 | 20/1/2019        
> A_y  |       2 |  35 | 20/1/2019        
> C_x  |       1 |  54 | 20/1/2019        
> C_y  |       1 |  65 | 20/1/2019        
> C_x  |       2 |  99 | 20/1/2019        
> C_y  |       2 |  77 | 20/1/2019        
> E_x  |       1 |  89 | 20/1/2019        
> E_y  |       1 |  27 | 20/1/2019        
> F_x  |       1 |  11 | 20/1/2019        
> F_y  |       1 |  22 | 20/1/2019        
0 голосов
/ 30 сентября 2019

Вам нужно разделить заказ на столбец Name. Попробуйте как:

...ORDER BY SUBSTRING(Name, 1, 1),Version,SUBSTRING(Name, 3, 1) 
...