2015-04-21 2 views
-1

У меня есть 4 столбца в таблице. Сейчас он находится в ниже форматаИзменить порядок строк, выбранных в SQL Server

Action Value_XML   Control_ID  Data_Value 
----------------------------------------------------------- 
SEARCH <ACTION v="SEARCH"/>  SEARCH   SEARCH 
SEARCH <BROKERREF v="BZ815"/> BROKERREF  BZ815 
SEARCH <SYSTEM v=" 0"/>  SYSTEM   0 
Chg  <ACTION v="Chg"/>   Chg    Chg 
Chg  <BROKERREF v="BZ815"/> BROKERREF  BZ815 
Chg  <SYSTEM v=" 0"/>  SYSTEM   0 

мне нужна запись в поле ниже формате

Action Value_XML   Control_ID  Data_Value 
-----------------------------------------------------------   
SEARCH <SYSTEM v=" 0"/>  SYSTEM   0 
SEARCH <BROKERREF v="BZ815"/> BROKERREF  BZ815 
SEARCH <ACTION v="SEARCH"/>  SEARCH   SEARCH 
Chg  <SYSTEM v=" 0"/>  SYSTEM   0 
Chg  <BROKERREF v="BZ815"/> BROKERREF  BZ815 
Chg  <ACTION v="Chg"/>   Chg    Chg 

Примечания: мне нужна строка, которая имеет такое же control_id и DataValue должна быть последней строкой для столбца частности действий

заранее спасибо

+0

У вас есть несогласованность в вашем столе. Значение для столбца Control_ID должно быть ACTION вместо SEARCH и Chg, если оно должно соответствовать значениям SYSTEM и BROKERREF. Это должно быть так? –

+0

Ничего. Я перечитаю вашу записку. –

+0

и каков должен быть порядок строк, где control_id и datavalue различны? – 1010

ответ

0

Добавить это в конце вашего запроса:

ORDER BY 
Action, 
CASE WHEN Control_ID = DataValue THEN 1 ELSE 0 END 
+0

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

+0

Даже он был сохранен в определенном физическом порядке (он фактически сохраняется в порядке любого кластерного индекса), единственный способ гарантировать порядок данных - с помощью 'ORDER BY' в выборе. Нет гарантированного порядка возвращенных данных без 'ORDER BY'. –

0

Вы, кажется, хотите вернуть результирующий набор, заказанный Action и Control_Id:

select t.* 
from table t 
order by Action, 
     choose(Control_Id, 'SYSTEM', 'BROKERREF', 'SEARCH', 'Chg'); 
+0

Я только что дал небольшую пробную информацию. У меня есть миллионы записей в таблице. Это динамический. Я не могу скопировать значения. Мне просто нужно заменить первую строку на последние строки и наоборот для отдельного столбца действий. Он сгруппирован по столбцу действия. –

0

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

DECLARE @T TABLE (Action varchar(30),value_xml varchar(30),ControlId varchar(20),Data_value varchar(20)) 
insert into @T (Action,value_xml,ControlId,Data_value)values ('SEARCH','<ACTION v="SEARCH"/>','SEARCH','SEARCH'), 
('SEARCH','<BROKERREF v="BZ815"/>','BROKERREF','BZ815'),('SEARCH','<SYSTEM v=" 0"/>','SYSTEM','0'), 
('Chg','<ACTION v="Chg"/>','Chg','Chg'),('Chg','<BROKERREF v="BZ815"/>','BROKERREF','BZ815'), 
('Chg','<SYSTEM v=" 0"/> ','SYSTEM','0') 

select * from @T 
ORDER BY Action desc,value_xml desc,ControlId desc,Data_value 
1
SELECT t.* 
FROM t 
ORDER BY Action, CASE WHEN Control_ID = Data_Value THEN 1 ELSE 0 END 
; 
+0

Возможно, вам нужно добавить другое поле, поэтому порядок строк, которые являются разными, сортируется последовательно. вы можете попробовать [здесь] (http://sqlfiddle.com/), если он работает. – 1010

+0

и OP хочет, чтобы строки с control_id = data_value были последними (так что это должно быть 'THEN 1 ELSE 0'). – 1010

+0

@ 1010 Я исправил это сейчас. Благодарю. –

Смежные вопросы