Сортировка "по горизонтали"

artemius
Дата: 21.01.2009 10:45:19
Здравствуйте всем,

есть таблица с полями Name1, Id1, Id2, Id3. Пусть она заполнена так:
name1 1 3 2
name2 5 1 3
name3 1 4 3
name4 2 3 1
name5 4 2 5

Мне нужно отсортировать числовые значения в каждой строке по возрастанию и отобразить данные следующим образом:
name1 123
name2 135
name3 134
name4 123
name5 245

Возможно ли такое сделать без определения дополнительных функций?

Спасибо!
programmator
Дата: 21.01.2009 10:47:40
case
Поле "автор" д
Дата: 21.01.2009 10:47:53
можно
CASE WHEN a>b and b>c THEN a ....
iap
Дата: 21.01.2009 11:00:26
SQL2005
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
GO
CREATE TABLE T(Name1 varchar(100), Id1 int, Id2 int, Id3 int);
INSERT T(Name1, Id1, Id2, Id3)
          SELECT 'name1', 1, 3, 2
UNION ALL SELECT 'name2', 5, 1, 3
UNION ALL SELECT 'name3', 1, 4, 3
UNION ALL SELECT 'name4', 2, 3, 1
UNION ALL SELECT 'name5', 4, 2, 5;

SELECT *,
 REPLACE((SELECT ':'+Id FROM(SELECT CAST(Id1 AS VARCHAR(11)) UNION ALL SELECT CAST(Id2 AS VARCHAR(11)) UNION ALL SELECT CAST(Id3 AS VARCHAR(11)))T(Id) ORDER BY Id FOR XML PATH('')),':','') Id
FROM T;
GO
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
iap
Дата: 21.01.2009 11:02:31
Правильнее так:
ЫЙД2005
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
GO
CREATE TABLE T(Name1 varchar(100), Id1 int, Id2 int, Id3 int);
INSERT T(Name1, Id1, Id2, Id3)
          SELECT 'name1', 1, 3, 2
UNION ALL SELECT 'name2', 5, 1, 3
UNION ALL SELECT 'name3', 1, 4, 3
UNION ALL SELECT 'name4', 2, 3, 1
UNION ALL SELECT 'name5', 4, 2, 5;


SELECT *,
 REPLACE((SELECT ':'+CAST(Id AS VARCHAR(11)) FROM(SELECT Id1 UNION ALL SELECT Id2 UNION ALL SELECT Id3)T(Id) ORDER BY Id FOR XML PATH('')),':','') Id
FROM T;
GO
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
Паганель
Дата: 21.01.2009 11:02:45
declare @t table(name varchar(10), id1 int, id2 int, id3 int)
insert into @t(name, id1, id2, id3)
select 'name1', 1, 3, 2 union all
select 'name2', 5, 1, 3 union all
select 'name3', 1, 4, 3 union all
select 'name4', 2, 3, 1 union all
select 'name5', 4, 2, 5

select name
      ,cast(substring(s, 0 * 17 + 4, 10) as int) as id1_new
      ,cast(substring(s, 1 * 17 + 4, 10) as int) as id2_new
      ,cast(substring(s, 2 * 17 + 4, 10) as int) as id3_new
 from (select name
             ,cast((select replace(str(id), ' ', '0') as s
                      from (select id1 as id union all
                            select id2 as id union all
                            select id3 as id
                            ) as tt
                     order by id
                       for xml path('')
                   ) as varchar(max)) as s
         from @t
       ) as x

name       id1_new     id2_new     id3_new
---------- ----------- ----------- -----------
name1      1           2           3
name2      1           3           5
name3      1           3           4
name4      1           2           3
name5      2           4           5

(5 row(s) affected)
iap
Дата: 21.01.2009 11:06:45
Или можно немного по-другому написать:
SQL2005
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
GO
CREATE TABLE T(Name1 varchar(100), Id1 int, Id2 int, Id3 int);
INSERT T(Name1, Id1, Id2, Id3)
          SELECT 'name1', 1, 3, 2
UNION ALL SELECT 'name2', 5, 1, 3
UNION ALL SELECT 'name3', 1, 4, 3
UNION ALL SELECT 'name4', 2, 3, 1
UNION ALL SELECT 'name5', 4, 2, 5;


SELECT *,
 REPLACE((SELECT CAST(Id AS VARCHAR(11))[data()] FROM(SELECT Id1 UNION ALL SELECT Id2 UNION ALL SELECT Id3)T(Id) ORDER BY Id FOR XML PATH('')),' ','') Id
FROM T;
GO
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
iap
Дата: 21.01.2009 11:17:47
Паганель,

а разве надо было значения разносить по разным колонкам? А я понял так, что их надо собрать в одной...
Кстати, я перемудрил:
SELECT *,(SELECT CAST(Id AS VARCHAR(11)) FROM(SELECT Id1 UNION ALL SELECT Id2 UNION ALL SELECT Id3)T(Id) ORDER BY Id FOR XML PATH('')) Id
FROM T;
Паганель
Дата: 21.01.2009 11:21:54
iap
а разве надо было значения разносить по разным колонкам?
Я так понял задачу
Если б автор отформатировал вопрос, таких непоняток не было бы
В любом случае, убрать "разнесение", думаю, для автора проблем не составит
artemius
Дата: 21.01.2009 11:43:12
Паганель,

разносить колонки не нужно :) Я же в табличке отобразил, что в новых данных значения полей id1, id2, id3 склеены.
Спасибо за предложенные способы!