Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
DNShark Member Откуда: Сообщений: 237 |
в общем столкнулся с такой проблемой. У меня есть отчет который генерируется по sql запросу. Раньше было просто ФИО, Тип телефона, номер телефона что-то вроде select R.Name,Type_tel.Type_name,Tel.PhoneNo From R join ... а теперь форма отчета стала ФИО , домашний телефон, мобильный телефон Есть таблицы. ФИО - Телефоны - Тип телефонов. Если один телефон, то всё норм, а если два и более, то он мне попарно выводит все результаты... А как сделать выборку так, чтобы ни домашние, ни мобильные телефоны не повторялись, а выводились только один раз. |
25 авг 15, 12:27 [18063911] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
DNShark, left join .. phonetype1 left join .. phonetype2 |
25 авг 15, 12:29 [18063928] Ответить | Цитировать Сообщить модератору |
DNShark Member Откуда: Сообщений: 237 |
WarAnt, так не катит получается что-то вроде Иванов 222 067123456788 Иванов 222 050876542212 Иванов 333 067123456788 Иванов 333 050876542212 А надо Иванов 222 067123456788 Иванов 333 050876542212 |
25 авг 15, 12:34 [18063984] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
вроде товарищу пивот нужен, т.е. раньше выводились все телефоны в столбец, а теперь надо в строку. и если несколько мобильных ("если два и более"), то надо все равно 1 строку, да? если это какой-нибудь репортинг, то tablix/matrix |
25 авг 15, 12:35 [18063993] Ответить | Цитировать Сообщить модератору |
DNShark Member Откуда: Сообщений: 237 |
o-o, а ну его). Выведу через запятую домашние и мобильные. А то совсем как-то бредово получается. Будет ФИО домашние: 222,333 мобильные: 06724234234,05023423424 так проще будет. |
25 авг 15, 12:43 [18064075] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
что значит не катит, вы схему тогда приведите, а то у вас получается что нет связи между фио и телефонами |
||
25 авг 15, 12:43 [18064076] Ответить | Цитировать Сообщить модератору |
DNShark Member Откуда: Сообщений: 237 |
WarAnt, схема таблица ФИО name idPhone таблица Телефон idPhone PhoneNo idTypePhone таблица типов телефонов idTypePhone NameTypePhone |
25 авг 15, 12:46 [18064101] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
DNShark, вы лучше скажите, что за отчетник, для репортинга могу картинкой показать, в 2 клика делается. |
25 авг 15, 12:49 [18064119] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
DNShark Member Откуда: Сообщений: 237 |
У нас тут своя функция написана, гавнокодик редкий, но обычно в неё не залазишь. Берет данные с бд и экспортирует в Excel. Просто указываешь в шаблоне отчета, какой набор данных и в какую ячейку вставлять. |
25 авг 15, 12:59 [18064191] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
DNShark Member Откуда: Сообщений: 237 |
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] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
окончательно: К сообщению приложен файл. Размер - 59Kb |
25 авг 15, 13:04 [18064230] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
o-o, про матрих в репортинге я знаю, но вопрос был про sql запрос |
25 авг 15, 13:15 [18064317] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
если вы не знаете точное количество телефонов, то только динамика c sum или с пивот, если через запятую то можно обойтись xml path type |
||
25 авг 15, 13:18 [18064332] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
WarAnt, у меня же запрос приведен. он такой же, надо только тип телефона занести в столбцы. он сам динамически нагенерит сколько надо столбцов. но можно и самому динамику(пивот по имеющимся типам) генерить, только зачем, если у него построитель запросов |
25 авг 15, 13:20 [18064338] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
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] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
где вы увидели намек на reportingservice? 18064191 |
||
25 авг 15, 13:55 [18064626] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
я вижу намек на отчет. а т.к. репортинг давно уже входит в бесплатный Экспресс, то почему бы им и не воспользоваться. чем он хуже говнофункции? и в Эксель прекрасно сохраняет |
||
25 авг 15, 14:00 [18064658] Ответить | Цитировать Сообщить модератору |
DNShark Member Откуда: Сообщений: 237 |
o-o, идея хорошая, может как-нибудь и переделаем |
25 авг 15, 14:30 [18064907] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
Ещё варианты - пивотить в репортной системе, как о-о написал, или делать динамическим SQL |
||||
25 авг 15, 15:45 [18065533] Ответить | Цитировать Сообщить модератору |
Вопрос__1
Guest |
DNShark, а что хотелось изначально (до варианта с запятой)? Например, у Иванова 2 телефона (111,222), а у Петрова 3 телефона (333, 444, 555)? Какой вывод предполагался? Или предполагался вывод в виде карточки телефонов конкретного ФИО? То есть в идеале хотелось бы всегда иметь одну строку, но с переменным числом столбцов (5 столбцов для 5 телефонов, 10 для 10 и так далее)? |
25 авг 15, 16:17 [18065882] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |