powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите составить запрос
10 сообщений из 10, страница 1 из 1
Помогите составить запрос
    #38161723
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Не могу сообразить, как мне получить выборку нужных данных.
Имеется две таблицы xsub и dsub, полученные на предыдущем этапе выборки. Их можно свести в одну с признаком принадлежности, если это упростит решение.
Требуется получить таблицу с записями из трех полей.
Первое поле - cell. Это должно быть full join соответствующих полей этих таблиц. Это значение в дальнейшем (или сразу) будет заменено на поле cellname из специальной таблицы listcell, которая имеет список всех возможных значений cell.
Второе поле - количество imsi из таблицы dsub для каждого значения cell.
Третье поле - количество imsi из таблицы xsub для каждого значения cell, но только тех, которые не встречаются в таблице dsub.

VFP9S1
...
Рейтинг: 0 / 0
Помогите составить запрос
    #38161788
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кузнецов Игорьfull join соответствующих полейДжойнить можно таблицы, а не поля. Наверное, имелось в виду, что в этом роле должны быть все cell - и из первой, и из второй таблицы.
Кузнецов Игорьколичество imsi из таблицы dsubколичество различных imsi, наверное?

Если мои допущения верны, то
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select cells.cells ,nvl(c1.cnt,0) ,nvl(c2.cnt,0)
from (
 select cell from dsub union select cell from xsub
) cells
left join (
/*чтобы морально Вас не разлагать, этот подзапрос предлагаю написать самому :)
разберётесь со вторым - напишете и этот, он проще*/
) c1 on cells.cell=c1.cell
left join (
 select xsub.cell,count(distinct xsub.imsi) as cnt
 from xsub 
 left join dsub on xsub.cell=dsub.cell
 where dsub.cell is null
 group by xsub.cell
) c2 on cells.cell=c2.cell
...
Рейтинг: 0 / 0
Помогите составить запрос
    #38161992
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir Джойнить можно таблицы, а не поля. Наверное, имелось в виду, что в этом роле должны быть все cell - и из первой, и из второй таблицы.
Да, конечно.
tanglir количество различных imsi, наверное?.
Они уже уникальны в пределах значения cell. Обеспечивается предыдущей выборкой.

Буду изучать предложенный вариант. Спасибо.

После рихтовки получилось:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select cells.cell, nvl(c1.cnt,0), nvl(c2.cnt,0);
	from (select cell from dsub union select cell from xsub) cells;
	left join (select dsub.cell, count(distinct dsub.imsi) as cnt;
 					from dsub ;
 					left join xsub on dsub.cell=xsub.cell;
 					group by dsub.cell) c1 ;
		on cells.cell=c1.cell;
	left join (select xsub.cell, count(distinct xsub.imsi) as cnt;
 					from xsub ;
 					left join dsub on xsub.cell=dsub.cell;
 					where dsub.cell is null;
 					group by xsub.cell) c2 ;
 		on cells.cell=c2.cell


Результат есть, буду анализировать его правдоподобность. Но сам бы я такой каскад не осилил. Еще раз спасибо.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #38162158
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кузнецов ИгорьВторое поле - количество imsi из таблицы dsub для каждого значения cell.
Кузнецов Игорь
Код: sql
1.
2.
3.
4.
select dsub.cell, count(distinct dsub.imsi) as cnt;
 					from dsub ;
 					left join xsub on dsub.cell=xsub.cell;
 					group by dsub.cell

Нет, это проще записывается. Подсказка: нужно убрать одну строчку :)
Хотя на результат, в общем-то, не повлияет, но работать будет быстрее.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #38162258
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, но я не могу понять.
Одну строку я уже убирал (WHERE ...).

А пока я прикрутил сюда обращение еще к одной таблицы, чтобы брать не только код для cell, но и название cell. Вот только связка корректно заработала только при VAL(listcell.cellno)=VAL(cells.cell). Иначе отбирались только значения для трехзначных cell (т.е. больше 100)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select cells.cell, listcell.cellname, nvl(c1.cnt,0), nvl(c2.cnt,0);
	from (select cell from dsub union select cell from xsub) cells;
	left join (select dsub.cell, count(distinct dsub.imsi) as cnt;
 					from dsub ;
 					left join xsub on dsub.cell=xsub.cell;
 					group by dsub.cell) c1 ;
		on cells.cell=c1.cell;
	left join (select xsub.cell, count(distinct xsub.imsi) as cnt;
 					from xsub ;
 					left join dsub on xsub.cell=dsub.cell;
 					where dsub.cell is null;
 					group by xsub.cell) c2 ;
 		on cells.cell=c2.cell;
 	inner JOIN listcell;
 		ON VAL(listcell.cellno)=VAL(cells.cell);
 		WHERE LEFT(listcell.region,2)=pfx


Но что-то меня терзают смутные сомнения. Некоторые значения оказались заменены звездочками. Значит, напортачил.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #38162298
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Третье поле почему-то получает размерность N(1). Умещаются только одноразрядные значения.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #38162303
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, четвертое согласно приведенному варианту. То есть nvl(c2.cnt,0).
...
Рейтинг: 0 / 0
Помогите составить запрос
    #38162472
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кузнецов ИгорьПрошу прощения, но я не могу понять.
Одну строку я уже убирал (WHERE ...).Хорошо, намекну толще. Подзапрос "с1" должен обращаться только к одной таблице (судя по заданию). Нужен ли в таком подзапросе джойн со второй таблицей?
Кузнецов ИгорьТретье поле почему-то получает размерность N(1). Умещаются только одноразрядные значения.Неважно, какое по счёту.
Используйте cast(... as Numeric(желаемый_размер))
Просто фокс определяет размер поля результата по первому выбранному значению этого поля. Получилось там число от 1 до 9 - значит, N(1), и всё тут :) А cast() позволяет указать, какой разрядности поле должно быть "на самом деле".
...
Рейтинг: 0 / 0
Помогите составить запрос
    #38164227
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласно Вашим подсказкам внес нужные изменения. В итоге получился такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 		SELECT cells.cell, listcell.cellname, CAST(NVL(c1.CNT,0) AS numeric(10,0)) AS cntdo, CAST(NVL(c2.CNT,0) AS numeric(10,0)) AS cnt1x;
		FROM (SELECT cell FROM dsub UNION SELECT cell FROM xsub) cells;
		LEFT JOIN (SELECT dsub.cell, COUNT(dsub.imsi) AS CNT;
 					FROM dsub ;
 					GROUP BY dsub.cell) c1 ;
			ON cells.cell=c1.cell;
		LEFT JOIN (SELECT xsub.cell, COUNT(xsub.imsi) AS CNT;
 					FROM xsub ;
 					LEFT JOIN dsub ON xsub.cell=dsub.cell;
 					WHERE dsub.cell IS NULL;
 					GROUP BY xsub.cell) c2 ;
 			ON cells.cell=c2.cell;
 		LEFT JOIN listcell;
 			ON VAL(listcell.cellno)=VAL(cells.cell);
 		WHERE LEFT(listcell.REGION,2)=pfx;
 	 	INTO TABLE (outname)


Спасибо за помощь.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #38164286
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не за что. Только ещё одно маленькое замечание:Кузнецов Игорь
Код: sql
1.
2.
3.
 		LEFT JOIN listcell;
 			ON VAL(listcell.cellno)=VAL(cells.cell);
 		WHERE LEFT(listcell.REGION,2)=pfx;

LEFT уберите.
Условие в where на поле из присоединяемой справа таблицы(listcell) как правило вырождает left join в inner join. Логически вырождает, а оптимизатор всё равно корячится, пытаясь лефт организовать.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите составить запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]