2015-06-18 4 views
0

У меня есть таблица с данными, похожими на:SQL-столбец сортировки и столбец обновления Б

Inven DESCRIPT  PrintOrder 
--------------------------------- 
1  D    9 
2  B    0 
3  A    5 
4  Z    0 
5  X    1 
.  .    . 
.  .    . 
.  .    . 

Я хотел бы отсортировать таблицу по столбцу дескриптов убыванию альфа (A - Z), а затем обновить столбец PRINTORDER так что когда сделано, запись с PRINTORDER = 1 является самой высокой альфа (A), и запись с самым высоким значением для PRINTORDER будет самой низкой в ​​альфа (Z).

Возможно ли это без использования временных столбцов? Не нарушитель сделки, если нет, просто предпочтение.

DESIRED РЕЗУЛЬТАТ:

Чтобы обновить значения PrintOrder на основе сортировки результата

Inven DESCRIPT  PrintOrder 
--------------------------------- 
1  D    3 
2  B    2 
3  A    1 
4  Z    5 
5  X    4 
+1

Можете ли вы отредактировать свой вопрос и предоставить желаемый результат? Кроме того, пометьте свой вопрос в базе данных, которую вы используете. Кроме того, вам просто нужен набор результатов или вы хотите изменить данные в базе данных? –

+0

Я добавил пример. Это MySQL. - Спасибо – Pha

+0

Завтра проверит в офисе и выберет ответ. Спасибо за помощь! – Pha

ответ

0

Это должно сделать это:

Update T 
set PRINTORDER = ASCII(UPPER(DESCRIPT)) - 64 

в то время как ASCII А это 65 в вашей системе , :)

EDIT:

Как вы сказали, что может быть что-то еще, так что мы должны изменить его немного, предполагая, у вас есть PK имя столбца, как Id:

UPDATE T 
set PRINTORDER = T2.Order 
FROM T 
    INNER JOIN (SELECT IDENTITY(int, 1,1) AS Order,Id FROM T Order By DESCRIPT ASC) T2 ON T.Id=T2.Id 

Но в этом даже две записи имеют одинаковый DESCRIPT, у них будет другой принтер, это может быть немного сложнее, если вы хотите сохранить их одинаковыми.

EDIT: Извините просто понял, что вы используете MySql, тождественность (Int, 1,1) от SQL Server, в основном это генерировать номер строки, вам может понадобиться что-то другое, чтобы иметь одно: http://blog.sqlauthority.com/2014/03/08/mysql-generating-row-number-for-each-row-using-variable/

+0

Будут значения INT, а также специальные символы (0-9 $% и т. Д.). Изменит ли этот факт ваш ответ? Как -32 или что-то включить больше? (Я только перечислял его как A-Z для иллюстративных целей) – Pha

+0

Или это зависит от того, какой набор символов определен для БД? – Pha

+0

Хм, я думал, что у вас там только A-Z, в этом случае это действительно зависит от того, как вы хотите заказать эти значения, ASCII должен быть точным для их заказа, если только один из них задействован. Но если у вас есть специальные символы, у них может быть более низкий номер ASCII, с которого A не может начинаться. Я шутил о ASCII, все системы имеют одинаковое значение для этих стандартных символов, не нужно беспокоиться, если они разные –

0

Непонятно, хотите ли вы до изменить таблицу или просто создать результирующий набор. Вот решение последней с помощью стандартного SQL:

select Inven, Descript, row_number() over (order by Descript) as PrintOrder 
from table t 
order by Descript; 

EDIT:

В MySQL, то select будет выглядеть так:

select t.* 
from (select Inven, Descript, (@rn := @rn + 1) as PrintOrder 
     from table t cross join (select @rn := 0) params 
     order by Descript 
    ) t 
order by Inven; 

update немного сложнее, потому что вы не можете сортировать и инициализировать переменную:

update t 
    set PrintOrder = (@rn := coalesce(@rn + 1, 1)) 
    order by Descript; 
0

После прибытия в мой офис и беседы с моим коллегой, поставленный вопрос является абсолютно неточным. Поэтому я закрою эту тему и открою новую, с более точным описанием проблемы.

Спасибо Gordon & Саймон за ваши отзывы, они наиболее ценятся.