Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Похоже, что перекрёстный запрос. Нужна помощь.  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 505
не уверен вообще, существуют ли такие запросы, но попробую объяснить:
есть таблица:
declare @tnames table(id, name varchar(10))
insert into @tnames(id, name)
select 1, 'Коля' union all
select 2, 'Вася' union all
select 3, 'Петя'

и есть таблица с информацией об этих людях, ключ на tnames по name_id:
declare @tinfo(id, name_id, descript, value)
insert into @tnames(id, name_id, descript, value)
select 1, 1, 'Возраст', 26 union all
select 2, 1, 'Дети', 1 union all
select 3, 2, 'Возраст', 22 union all
select 4, 3, 'Возраст', 29 union all
select 5, 3, 'Положение', 'Холост'


и получить мне нужно развёрнутую таблицу такого плана:
Имя	Возраст	Дети	Положение
Коля 26 1
Вася 22
Петя 29 Холост

т.е. чтобы все возможные descript отбирались по ширине.
скажите, как это выполнить?
13 июн 09, 17:23    [7296053]     Ответить | Цитировать Сообщить модератору
 Re: Похоже, что перекрёстный запрос. Нужна помощь.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
Топ 10 вопрос 10.
13 июн 09, 18:19    [7296140]     Ответить | Цитировать Сообщить модератору
 Re: Похоже, что перекрёстный запрос. Нужна помощь.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
palladin600
есть таблица:
....
и есть таблица с информацией об этих людях
Нет никаких таблиц. Хоть бы про синтаксис сначала почитали!
Сами-то запросы свои выполняли?
К тому же это не таблицы, а табличные переменные.

И где информация о версии сервера?
13 июн 09, 19:03    [7296180]     Ответить | Цитировать Сообщить модератору
 Re: Похоже, что перекрёстный запрос. Нужна помощь.  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 505
Гавриленко Сергей Алексеевич
Топ 10 вопрос 10.

не нашёл я там ответа, всё както очень запутанно по тем ссылкам и поиску


iap
Нет никаких таблиц. Хоть бы про синтаксис сначала почитали!
Сами-то запросы свои выполняли?
К тому же это не таблицы, а табличные переменные.

И где информация о версии сервера?

эх, вот тут я дал, маху...
поспешил - людей насмешил.

вот, исправился:
declare @tnames table(id int, name varchar(10))
insert into @tnames(id, name)
select 1, 'Коля' union all
select 2, 'Вася' union all
select 3, 'Петя'

declare @tinfo table(id int, name_id int, descript varchar(30), value varchar(30))
insert into @tinfo(id, name_id, descript, value)
select 1, 1, 'Возраст', '26' union all
select 2, 1, 'Дети', '1' union all
select 3, 2, 'Возраст', '22' union all
select 4, 3, 'Возраст', '29' union all
select 5, 3, 'Положение', 'Холост'

сервер:
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c)
1988-2005 Microsoft Corporation Express Edition on Windows NT 6.0 (Build 6001: Service Pack 1)
13 июн 09, 19:50    [7296208]     Ответить | Цитировать Сообщить модератору
 Re: Похоже, что перекрёстный запрос. Нужна помощь.  [new]
iljy
Guest
palladin600,

в этом топике обсуждалась похожая проблема
13 июн 09, 20:44    [7296259]     Ответить | Цитировать Сообщить модератору
 Re: Похоже, что перекрёстный запрос. Нужна помощь.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
В 2005-ом можно, конечно, PIVOT применить, но мне больше нравится CASE
SET NOCOUNT ON;

declare @tnames table(id int, name varchar(10));
insert into @tnames(id, name)
select 1, 'Коля' union all
select 2, 'Вася' union all
select 3, 'Петя';

declare @tinfo table(id int, name_id int, descript varchar(30), value varchar(30));
insert into @tinfo(id, name_id, descript, value)
select 1, 1, 'Возраст', '26' union all
select 2, 1, 'Дети', '1' union all
select 3, 2, 'Возраст', '22' union all
select 4, 3, 'Возраст', '29' union all
select 5, 3, 'Положение', 'Холост';

SET ANSI_WARNINGS OFF;
SELECT 
 n.name Имя,
 MIN(CASE i.descript WHEN 'Возраст'   THEN i.value END) Возраст,
 MIN(CASE i.descript WHEN 'Дети'      THEN i.value END) Дети,
 MIN(CASE i.descript WHEN 'Положение' THEN i.value END) Положение
FROM @tnames n LEFT JOIN @tinfo i ON n.id=i.name_id
GROUP BY n.name;
13 июн 09, 21:42    [7296336]     Ответить | Цитировать Сообщить модератору
 Re: Похоже, что перекрёстный запрос. Нужна помощь.  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 505
iap,

мегаблагодарность!

а, вот я хотел спросить, а если этих параметров 100, то необходимо вручную добивать их в запрос?
...
SELECT 
 n.name Имя,
 MIN(CASE i.descript WHEN 'Возраст'   THEN i.value END) Возраст,
 MIN(CASE i.descript WHEN 'Дети'      THEN i.value END) Дети,
 MIN(CASE i.descript WHEN 'Положение' THEN i.value END) Положение,
 MIN(CASE i.descript WHEN 'Рабочий' THEN i.value END) Рабочий,
 MIN(CASE i.descript WHEN 'Привычки' THEN i.value END) Привычки,
 MIN(CASE i.descript WHEN 'Рост' THEN i.value END) Рост
--и т.д.
FROM @tnames n LEFT JOIN @tinfo i ON n.id=i.name_id
GROUP BY n.name;
...
на всякий случай скажу, что у меня есть таблица с перечислением всех используемых свойств. может её можно задействовать?
13 июн 09, 22:11    [7296376]     Ответить | Цитировать Сообщить модератору
 Re: Похоже, что перекрёстный запрос. Нужна помощь.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
palladin600
а, вот я хотел спросить, а если этих параметров 100, то необходимо вручную добивать их в запрос?
А если их 10000? 10000 колонок что-ли? Кому это надо?! Паранойя какая-то!
IMHO, конечно...
13 июн 09, 22:15    [7296381]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить