SQL Server: Перевод рядов в колонки
От: DedPakhom  
Дата: 05.04.04 15:17
Оценка:
Люди, помогите быстрее! Пожалуйста!:

Есть таблица в SQL Server'e:

id | text | comment

1 | aaa | aaa_comm
1 | bbb | bbb_comm
2 | ccc | ccc_comm
2 | ddd | ddd_comm
3 | eee | eee_comm
3 | fff | fff_comm
4 | ggg | ggg_comm

Надо:



id | text1 | text2 | comment1 | comment2

1 | aaa | bbb | aaa_comm | bbb_comm
2 | ccc | ddd | ccc_comm | ddd_comm
3 | eee | fff | eee_comm | fff_comm
4 | ggg | NULL | ggg_comm | NULL

Как написать соответствующий SQL запрос?
Re: SQL Server: Перевод рядов в колонки
От: yogi Россия  
Дата: 05.04.04 15:56
Оценка:
Если у тебя всегда не более конкретного числа записей с одинаковым id (например 2), то можно сделать что-то вроде
select id1, text1, text2, comment1, comment2
from
    (select
        rownum as r1,
        id as id1,
        text as text1,
        comment as comment1
    from table
    order by id,text,comment) A
left join
    (select
        rownum as r2,
        id as id2,
        text as text2,
        comment as comment2
    from table
    order by id,text,comment) B
on 
    id1=id2 and r1<>r2

Если же количество записей для одного id не ограничено, то одним запросом никак.
Путь к сердцу женщины лежать не должен.
Re[2]: SQL Server: Перевод рядов в колонки
От: DedPakhom  
Дата: 05.04.04 16:19
Оценка:
Error:

Server: Msg 1033, Level 15, State 1, Line 9
The ORDER BY clause is invalid in views, inline functions, derived tables, and subqueries, unless TOP is also specified.
Server: Msg 156, Level 15, State 1, Line 17
Incorrect syntax near the keyword 'order'.
Re[3]: SQL Server: Перевод рядов в колонки
От: DedPakhom  
Дата: 05.04.04 16:31
Оценка:
я вот так сделал:


select id1, text1, text2, comment1, comment2
from
(select top 100
(SELECT COUNT(*) FROM dbo.test_table) as r1,
id as id1,
text as text1,
comment as comment1
from dbo.test_table
order by id,text,comment) A
left join
(select top 100
(SELECT COUNT(*) FROM dbo.test_table) as r2,
id as id2,
text as text2,
comment as comment2
from dbo.test_table
order by id,text,comment) B
on
id1=id2 and r1<>r2



но результат не тот что задумывался

id text1 text2 comment1 comment2

1 aaa NULL aaa_comm NULL
1 bbb NULL bbb_comm NULL
2 asd NULL asd_comm NULL
2 ccc NULL ccc_comm NULL
3 ddd NULL ddd_comm NULL
4 eee NULL eee_comm NULL
Re[4]: SQL Server: Перевод рядов в колонки
От: yogi Россия  
Дата: 05.04.04 16:47
Оценка:
Здравствуйте, DedPakhom, Вы писали:

DP>я вот так сделал:


Count(*) там совершенно ни к месту. Я не знаю есть ли в MSSQL rownum, в оракле это псевдополе является порядковым номером строки в конкретной выборке. Это поле+правила сортировки позволяют при джоине таблицы самой с собой джоинить различные строки. В принципе в оракле я мог бы использовать rowid и забить на rownum и сортировку. Если нет ни rownum ни чего-то вроде rowid, то можно в таблицу ввести уникальный идентификатор uniqueid и в джоине писать uniqueid1<>uniqueid2...
Путь к сердцу женщины лежать не должен.
Re[5]: SQL Server: Перевод рядов в колонки
От: DedPakhom  
Дата: 05.04.04 17:05
Оценка:
спасибо, вот так сделал:

select id1, text1, text2, comment1, comment2
from
(select top 100
rowid as r1,
id as id1,
text as text1,
comment as comment1
from dbo.test_table
order by id,text,comment) A
left join
(select top 100
rowid as r2,
id as id2,
text as text2,
comment as comment2
from dbo.test_table
order by id,text,comment) B
on
id1=id2 and r1<>r2


результат:

id text1 text2 comment1 comment2

1 aaa bbb aaa_comm bbb_comm
1 bbb aaa bbb_comm aaa_comm
2 asd ccc asd_comm ccc_comm
2 ccc asd ccc_comm asd_comm
3 ddd NULL ddd_comm NULL
4 eee NULL eee_comm NULL


a надo так:

id text1 text2 comment1 comment2

1 aaa bbb aaa_comm bbb_comm
2 asd ccc asd_comm ccc_comm
3 ddd NULL ddd_comm NULL
4 eee NULL eee_comm NULL
Re[6]: SQL Server: Перевод рядов в колонки
От: yogi Россия  
Дата: 05.04.04 17:20
Оценка:
Здравствуйте, DedPakhom, Вы писали:

Ну во-первых сортировки в подзапросах уже не нужны.
Во-вторых, проблему можно решить так:
Первый подзапрос:
    (select top 100
        rowid   as r1,
        id as id1,
        text as text1,
        comment as comment1
    from dbo.test_table
    where rowid in (select max(rowid) from dbo.test_table group by id)) A


Второй подзапрос соответственно будет с условием
where rowid not in ...
Путь к сердцу женщины лежать не должен.
Re[7]: SQL Server: Перевод рядов в колонки
От: DedPakhom  
Дата: 05.04.04 18:19
Оценка:
Здравствуйте, yogi, Вы писали:

Y>Здравствуйте, DedPakhom, Вы писали:


Y>Ну во-первых сортировки в подзапросах уже не нужны.

Y>Во-вторых, проблему можно решить так:
Y>Первый подзапрос:
Y>
Y>    (select top 100
Y>        rowid   as r1,
Y>        id as id1,
Y>        text as text1,
Y>        comment as comment1
Y>    from dbo.test_table
Y>    where rowid in (select max(rowid) from dbo.test_table group by id)) A
Y>


Y>Второй подзапрос соответственно будет с условием
where rowid not in ...




спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.