Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как сделать SQL-запрос / 12 сообщений из 12, страница 1 из 1
10.09.2009, 11:30
    #36188115
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
Есть список продуктов, каждый состоит из ряда компонентов.
Tab_prod :
cod_prodname_prod1 name_12 name_2... ...
Tab_prod_cmpt :
cod_prodcod_cmpt1 L... ...N M
Как сделать SQL-запрос, чтобы иметь результирующий список продуктов, которые состоят только из (например, 2-х) определенных компонентов?
...
Рейтинг: 0 / 0
10.09.2009, 11:56
    #36188191
Ikar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
Навскидку, не проверяя, как то так, хотя, могу и ошибаться...

Код: plaintext
1.
2.
3.
SELECT DISTINCT p.cod_prod, p.name_prod
FROM Tab_prod p
    INNER JOIN Tab_prod_cmpt c ON c.cod_prod = p.cod_prod
WHERE c.cod_cmpt IN (cod1, cod2, ..., codN)
...
Рейтинг: 0 / 0
10.09.2009, 14:00
    #36188638
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
IkarНавскидку, не проверяя, как то так, хотя, могу и ошибаться...

Код: plaintext
1.
2.
3.
SELECT DISTINCT p.cod_prod, p.name_prod
FROM Tab_prod p
    INNER JOIN Tab_prod_cmpt c ON c.cod_prod = p.cod_prod
WHERE c.cod_cmpt IN (cod1, cod2, ..., codN)

А если требуется чтобы в каждом выбранном продукте были все указанные компоненты, то так:
Код: plaintext
1.
2.
3.
4.
5.
SELECT p.cod_prod, p.name_prod
FROM Tab_prod p
    INNER JOIN Tab_prod_cmpt c ON c.cod_prod = p.cod_prod
WHERE c.cod_cmpt IN (cod1, cod2, ..., codN)
GROUP BY p.cod_prod, p.name_prod
HAVING COUNT(c.cod_cmpt) = N 
...
Рейтинг: 0 / 0
13.09.2009, 01:06
    #36192732
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
Варианты выше, не подходят.
Стоит задача подбора точного аналога. Т.е. Если продукт состоит из двух компонентов, то надо найти в списке продуктов только те продукты, которые состоят только из этих двух компонентов (без каких либо ещё).
А предложенные варианты выводят кроме нужных продуктов и те, в которых кроме указанные в качестве параметров есть и другие компоненты.
Например, только те в которых одновременно есть Fe и Cu. Т.е. варианты Fe+X, Cu+X, Fe+Cu+X...+Y - неподходят.
...
Рейтинг: 0 / 0
13.09.2009, 02:51
    #36192774
sPaul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT p.cod_prod, p.name_prod
FROM Tab_prod p
    INNER JOIN Tab_prod_cmpt c ON c.cod_prod = p.cod_prod
--WHERE c.cod_cmpt IN (cod1, cod2, ..., codN)
GROUP BY p.cod_prod, p.name_prod
--HAVING COUNT(c.cod_cmpt) = N 
HAVING sum(case when c.cod_cmpt IN (cod1, cod2, ..., codN) then  1  else - 1  end) = N
...
Рейтинг: 0 / 0
13.09.2009, 05:04
    #36192786
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
AISА предложенные варианты выводят кроме нужных продуктов и те, в которых кроме указанные в качестве параметров есть и другие компоненты.
Например, только те в которых одновременно есть Fe и Cu. Т.е. варианты Fe+X, Cu+X, Fe+Cu+X...+Y - неподходят.
Да, действительно - не внимательно прочитал, сорри.
...
Рейтинг: 0 / 0
13.09.2009, 11:53
    #36192870
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
sPaul ,
большое спасибо, получилось, это то что нужно.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
22.12.2016, 16:10
    #39373093
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
Прошли годы и вот опять та же задача:
AISЕсть список продуктов, каждый состоит из ряда компонентов.
Tab_prod :
cod_prodname_prod1 name_12 name_2... ...
Tab_prod_cmpt :
cod_prodcod_cmpt1 L... ...N M
Как сделать SQL-запрос, чтобы иметь результирующий список продуктов, которые состоят только из (например, 2-х) определенных компонентов?
Спасибо sPaul , его пример сработал.
sPaul
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT p.cod_prod, p.name_prod
FROM Tab_prod p
    INNER JOIN Tab_prod_cmpt c ON c.cod_prod = p.cod_prod
--WHERE c.cod_cmpt IN (cod1, cod2, ..., codN)
GROUP BY p.cod_prod, p.name_prod
--HAVING COUNT(c.cod_cmpt) = N 
HAVING sum(case when c.cod_cmpt IN (cod1, cod2, ..., codN) then 1 else -1 end) = N


Сейчас появились изменения в таблице связей, в которую введен столбец - количество отдельного компонента в продукте.
Код: sql
1.
2.
3.
4.
5.
6.
Tab_prod_cmpt:
[CSV]cod_prod,cod_cmpt, count_cmpt
1, L, 26
..., ...
N, M, 51
[/CSV]


И теперь появилось доп. условие: надо иметь результирующий список продуктов, которые состоят НЕ только из (например, 2-х) определенных компонентов как ранее, НО и содержат их в соответствующих одинаковых количествах.

Т.е. например:
1.Товар1 состоящий из Компонент1(100шт.)+Компонент2(50шт.)
2.Товар2 состоящий из Компонент1( 101 шт.)+Компонент2(50шт.)
3.Товар3 состоящий из Компонент1(100шт.)+Компонент2(50шт.)
4.Товар4 состоящий из Компонент1(100шт.)+Компонент2( 51 шт.)

Ранее вывело бы все 4-е товара, а сейчас должно вывести только 1 и 3.

Как изменить запрос, который ранее работал, с учетом нового условия?
...
Рейтинг: 0 / 0
23.12.2016, 11:08
    #39373561
dya
dya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
Прошу прощения, что не к месту вопрос, но так как тему мне заводить нельзя - пишу сюда. Как завязаться на событие скролинга в VTrackBar PB11 при помощи колеса мыши? Листается, но код обработчика привязать не знаю куда, чтобы реакцию назначить на это событие. Прошу понимания и помощи.
...
Рейтинг: 0 / 0
25.12.2016, 23:09
    #39374917
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
AIS,

Посмотрите, может то, все не прогонял (наверное можно и оптимизнуть и по скорости и по скрипту):


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
declare  @Tab_prod table (cod_prod int ,name_prod varchar(400))
insert into @Tab_prod values (1,'name_1')
insert into @Tab_prod values (2,'name_2')
insert into @Tab_prod values (3,'name_3')

declare @Tab_prod_cmpt table (cod_prod int, cod_cmpt varchar(10) , count_cmpt int)
insert into @Tab_prod_cmpt values(1,1,100)
insert into @Tab_prod_cmpt values(1,2,50)
insert into @Tab_prod_cmpt values(2,1,101)
insert into @Tab_prod_cmpt values(2,2,50)
insert into @Tab_prod_cmpt values(3,1,100)
insert into @Tab_prod_cmpt values(3,2,50)
insert into @Tab_prod_cmpt values(4,1,100)
insert into @Tab_prod_cmpt values(4,2,50)
insert into @Tab_prod_cmpt values(4,2,52)

;with t as 
(
select t1.cod_prod, row_number()  over(PARTITION BY t1.cod_prod order by t1.cod_cmpt , t1.count_cmpt) as rw 
, (select count(*) from @Tab_prod_cmpt as t2 where t2.cod_prod = t1.cod_prod) as coun
,t1.cod_cmpt , t1.count_cmpt
from @Tab_prod_cmpt as t1
)


, tt as 
(
select * from t as t1
where exists ( select 1 from t as t2
               where t1.cod_prod <> t2.cod_prod
			   and   t1.coun = t2.coun
			   and   t1.cod_cmpt = t2.cod_cmpt and t1.count_cmpt = t2.count_cmpt 
			   and   t1.rw = t2.rw
			  ) 
)

-- Вывод
select distinct t1.cod_prod , 
(select name_prod from @Tab_prod where cod_prod = t1.cod_prod) as name_prod
from tt as t1 
where t1.coun = (select count(*) from tt as t3 where t3.cod_prod = t1.cod_prod)
and exists (select 1 from tt as t2 where 
             t2.coun = (select count(*) from tt as t4 where t4.cod_prod = t2.cod_prod)   
             and t2.cod_prod <> t1.cod_prod
             and t1.rw         = t2.rw
			 and t1.cod_cmpt   = t2.cod_cmpt 
			 and t1.count_cmpt = t2.count_cmpt
            ) 
 



...
Рейтинг: 0 / 0
26.12.2016, 11:11
    #39375117
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
medoed ,
спасибо, что откликнулись, буду пробовать.
...
Рейтинг: 0 / 0
28.12.2016, 09:56
    #39376581
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать SQL-запрос
dyaПрошу прощения, что не к месту вопрос, но так как тему мне заводить нельзя - пишу сюда. Как завязаться на событие скролинга в VTrackBar PB11 при помощи колеса мыши? Листается, но код обработчика привязать не знаю куда, чтобы реакцию назначить на это событие. Прошу понимания и помощи.
Попробуйте использовать события lineup и linedown
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как сделать SQL-запрос / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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