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

Откуда:
Сообщений: 238
в общем столкнулся с такой проблемой. У меня есть отчет который генерируется по sql запросу. Раньше было просто

ФИО, Тип телефона, номер телефона

что-то вроде
select R.Name,Type_tel.Type_name,Tel.PhoneNo From R join ...


а теперь форма отчета стала

ФИО , домашний телефон, мобильный телефон

Есть таблицы. ФИО - Телефоны - Тип телефонов.

Если один телефон, то всё норм, а если два и более, то он мне попарно выводит все результаты... А как сделать выборку так, чтобы ни домашние, ни мобильные телефоны не повторялись, а выводились только один раз.
25 авг 15, 12:27    [18063911]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
DNShark,

left join .. phonetype1
left join .. phonetype2
25 авг 15, 12:29    [18063928]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
DNShark
Member

Откуда:
Сообщений: 238
WarAnt,

так не катит получается что-то вроде

Иванов 222 067123456788
Иванов 222 050876542212
Иванов 333 067123456788
Иванов 333 050876542212

А надо

Иванов 222 067123456788
Иванов 333 050876542212
25 авг 15, 12:34    [18063984]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
o-o
Guest
вроде товарищу пивот нужен,
т.е. раньше выводились все телефоны в столбец, а теперь надо в строку.
и если несколько мобильных ("если два и более"), то надо все равно 1 строку, да?
если это какой-нибудь репортинг, то tablix/matrix
25 авг 15, 12:35    [18063993]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
DNShark
Member

Откуда:
Сообщений: 238
o-o, а ну его). Выведу через запятую домашние и мобильные. А то совсем как-то бредово получается. Будет

ФИО домашние: 222,333 мобильные: 06724234234,05023423424

так проще будет.
25 авг 15, 12:43    [18064075]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
DNShark
WarAnt,

так не катит получается что-то вроде

Иванов 222 067123456788
Иванов 222 050876542212
Иванов 333 067123456788
Иванов 333 050876542212

А надо

Иванов 222 067123456788
Иванов 333 050876542212


что значит не катит, вы схему тогда приведите, а то у вас получается что нет связи между фио и телефонами
25 авг 15, 12:43    [18064076]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
DNShark
Member

Откуда:
Сообщений: 238
WarAnt,

схема

таблица ФИО
name
idPhone

таблица Телефон
idPhone
PhoneNo
idTypePhone

таблица типов телефонов
idTypePhone
NameTypePhone
25 авг 15, 12:46    [18064101]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
o-o
Guest
DNShark,

вы лучше скажите, что за отчетник, для репортинга могу картинкой показать,
в 2 клика делается.
25 авг 15, 12:49    [18064119]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
DNShark,

create table #fio (fio varchar(100), phoneid int)
create table #phone (phoneid int, phonetype int)

insert #phone select 1, 1
insert #phone select 2, 2
insert #fio select 'вася', 1
insert #fio select 'вася', 2
insert #fio select 'петя', 1


select
	fio, max( h1.phoneid), max( h2.phoneid) 
from 
	#fio  f
	left join #phone h1 on h1.phoneid = f.phoneid and h1.phonetype = 1
	left join #phone h2 on h2.phoneid = f.phoneid and h2.phonetype = 2
group by 
	fio


идея понятна?
25 авг 15, 12:55    [18064157]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
DNShark
Member

Откуда:
Сообщений: 238
У нас тут своя функция написана, гавнокодик редкий, но обычно в неё не залазишь. Берет данные с бд и экспортирует в Excel. Просто указываешь в шаблоне отчета, какой набор данных и в какую ячейку вставлять.
25 авг 15, 12:59    [18064191]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
o-o
Guest
WarAnt,

нет, у него может быть *более двух* номеров.
сколько типов, столько и номеров, т.е. сегодня 3, завтра 5.
в репортинге на этот случай есть matrix.
запрос все тот же:
declare @fio table(name varchar(100), idPhone int);
insert into @fio values ('Ivanov', 1), ('Ivanov', 2), ('Ivanov', 3), ('Petrov', 4);

declare @ph_types table (idTypePhone int, NameTypePhone varchar(100));
insert into @ph_types values (1, 'simple phone'), (2,'super phone'), (3,'super-puper phone')

declare @phones table (idPhone int, num bigint, idTypePhone int);
insert into @phones values (1, 222, 1), (2, 333, 2), (3, 067123456788, 3), (4, 111111111, 1);

select f.name, p.num, t.NameTypePhone
from @fio f join @phones p on f.idPhone = p.idPhone 
            join @ph_types t on p.idTypePhone = t.idTypePhone;

а накликать надо по-другому.
вот картинкой:

К сообщению приложен файл. Размер - 23Kb
25 авг 15, 13:03    [18064221]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
DNShark
Member

Откуда:
Сообщений: 238
WarAnt,

Вы же только один номер выводите, а если их два или три. Например на данных

insert #phone select 1, 1
insert #phone select 2, 2
insert #phone select 3, 1
insert #phone select 4, 2
insert #fio select 'вася', 1
insert #fio select 'вася', 2
insert #fio select 'вася', 3
insert #fio select 'вася', 4


то ничего не получится, надо все 4 вывести телефона.
25 авг 15, 13:04    [18064227]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
o-o
Guest
окончательно:

К сообщению приложен файл. Размер - 59Kb
25 авг 15, 13:04    [18064230]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
o-o,

про матрих в репортинге я знаю, но вопрос был про sql запрос
25 авг 15, 13:15    [18064317]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
DNShark
WarAnt,

Вы же только один номер выводите, а если их два или три. Например на данных

insert #phone select 1, 1
insert #phone select 2, 2
insert #phone select 3, 1
insert #phone select 4, 2
insert #fio select 'вася', 1
insert #fio select 'вася', 2
insert #fio select 'вася', 3
insert #fio select 'вася', 4


то ничего не получится, надо все 4 вывести телефона.
\

если вы не знаете точное количество телефонов, то только динамика c sum или с пивот, если через запятую то можно обойтись xml path type
25 авг 15, 13:18    [18064332]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
o-o
Guest
WarAnt,

у меня же запрос приведен.
он такой же, надо только тип телефона занести в столбцы.
он сам динамически нагенерит сколько надо столбцов.
но можно и самому динамику(пивот по имеющимся типам) генерить,
только зачем, если у него построитель запросов
25 авг 15, 13:20    [18064338]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
DNShark
Выведу через запятую домашние и мобильные
declare @h table (h_id int primary key, h_Name varchar(30));
declare @hp table (h_id int, phone varchar(30), phone_type int not null, primary key (h_id, phone));

insert into @h
values
 (1, 'Иванов И.И.');

insert into @hp
values
 (1, '111', 1),
 (1, '222', 1),
 (1, '333', 2),
 (1, '444', 2);

select
 h.*,
 stuff(p.x.query('for $p in (record[phone_type = 1]/phone) return concat(", ", string($p))').value('.', 'varchar(max)'), 1, 2, '') as [phone_type = 1],
 stuff(p.x.query('for $p in (record[phone_type = 2]/phone) return concat(", ", string($p))').value('.', 'varchar(max)'), 1, 2, '') as [phone_type = 2]
from
 @h h outer apply
 (select (select phone, phone_type from @hp where h_id = h.h_id for xml path('record'), type)) p(x);
25 авг 15, 13:21    [18064343]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
o-o
WarAnt,

у меня же запрос приведен.
он такой же, надо только тип телефона занести в столбцы.
он сам динамически нагенерит сколько надо столбцов.
но можно и самому динамику(пивот по имеющимся типам) генерить,
только зачем, если у него построитель запросов


где вы увидели намек на reportingservice? 18064191
25 авг 15, 13:55    [18064626]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
o-o
Guest
DNShark
У нас тут своя функция написана, гавнокодик редкий, но обычно в неё не залазишь. Берет данные с бд и экспортирует в Excel. Просто указываешь в шаблоне отчета, какой набор данных и в какую ячейку вставлять.

я вижу намек на отчет.
а т.к. репортинг давно уже входит в бесплатный Экспресс,
то почему бы им и не воспользоваться.
чем он хуже говнофункции?
и в Эксель прекрасно сохраняет
25 авг 15, 14:00    [18064658]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
DNShark
Member

Откуда:
Сообщений: 238
o-o,

идея хорошая, может как-нибудь и переделаем
25 авг 15, 14:30    [18064907]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32167
DNShark
Вы же только один номер выводите
Два номера он выводит. Там же три столбца в выводе - fio, первый номер, второй
DNShark
а если их два или три
Если три - то ещё один джойн

Ещё варианты - пивотить в репортной системе, как о-о написал, или делать динамическим SQL
25 авг 15, 15:45    [18065533]     Ответить | Цитировать Сообщить модератору
 Re: Выборка телефонов  [new]
Вопрос__1
Guest
DNShark, а что хотелось изначально (до варианта с запятой)? Например, у Иванова 2 телефона (111,222), а у Петрова 3 телефона (333, 444, 555)? Какой вывод предполагался? Или предполагался вывод в виде карточки телефонов конкретного ФИО? То есть в идеале хотелось бы всегда иметь одну строку, но с переменным числом столбцов (5 столбцов для 5 телефонов, 10 для 10 и так далее)?
25 авг 15, 16:17    [18065882]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить