Страница 1 из 1

Вернуть запросом количество уникальных записей по складам.

Добавлено: 13 фев 2007, 00:02
msa
FB 1.5

таблица stocks

id_tovar sklad_name
10 a1
20 a2
30 a3
60 a1
10 a2
20 a4
50 a1


Как запросом вернуть количество уникальных товаров для каждого склада, т.е. тех товаров. которых нет на др. складах ? или показать список уникальных для каждого склада. С параметром для одного склада нет проблем, а вот по всем никак не получается :(

Нужно:

1 a3 // id = 30
2 a1 // id = 50 и 60

Добавлено: 13 фев 2007, 03:32
barabo
Список товаров, кот. привязаны только к 1-му складу можно выбрать, например, так:

Код: Выделить всё

select T0.id_tovar from STOCKS T0
join (select T.sklad_name from  STOCKS T
group by T.sklad_name
having count(*) = 1) T2 on T0.sklad_name = T2.sklad_name
Скорее всего не самый оптимальный, но зато таким запросом можно выбирать товары, кот. имеются на 2-х, складах 3-х и т.д. меняя одну цифру

Добавлено: 13 фев 2007, 09:03
mdfv
Могу предложить такое безобразие:

Код: Выделить всё

select st1.SKLAD_NAME, (select(count( distinct st2.ID_TOVAR)) from stocks st2 where (st2.sklad_name=st1.sklad_name)and (not exists(select st3.ID_TOVAR from stocks st3 where((st3.id_tovar=st2.id_tovar)and(st3.sklad_name<>st2.sklad_name)) ) )) kolunictovar
  from stocks st1
where (not exists(select st3.ID_TOVAR from stocks st3 where((st3.id_tovar=st1.id_tovar)and(st3.sklad_name<>st1.sklad_name)) ) )
group by  st1.SKLAD_NAME
или так немного хуже

Код: Выделить всё

select st1.SKLAD_NAME, (select(count( distinct st2.ID_TOVAR)) from stocks st2 where (st2.sklad_name=st1.sklad_name)and (not exists(select st3.ID_TOVAR from stocks st3 where((st3.id_tovar=st2.id_tovar)and(st3.sklad_name<>st2.sklad_name)) ) )) kolunictovar
  from stocks st1
group by  st1.SKLAD_NAME
having (select(count( distinct st2.ID_TOVAR)) from stocks st2 where (st2.sklad_name=st1.sklad_name)and (not exists(select st3.ID_TOVAR from stocks st3 where((st3.id_tovar=st2.id_tovar)and(st3.sklad_name<>st2.sklad_name)) ) ))>0
А так можно если не обращать внимание на 0 количество

Код: Выделить всё

select st1.SKLAD_NAME, (select(count( distinct st2.ID_TOVAR)) from stocks st2 where (st2.sklad_name=st1.sklad_name)and (not exists(select st3.ID_TOVAR from stocks st3 where((st3.id_tovar=st2.id_tovar)and(st3.sklad_name<>st2.sklad_name)) ) )) kolunictovar
  from stocks st1
group by  st1.SKLAD_NAME
Пробовал на 2.0.1, на 1.5 тоже наверное должно,
Для 2 конечно можно и получше оптимизировать.

Добавлено: 13 фев 2007, 17:11
msa
mdfv писал(а): А так можно если не обращать внимание на 0 количество
тормоз жуткий. Написал процедуру. Нет вермени на эксперименты. Если кто еще варианты предложит, буду благодарен.

Добавлено: 13 фев 2007, 18:19
WildSery
Вот ещё вариант.

Код: Выделить всё

select s.*
  from stocks s
  where not exists (select 1
                      from stocks s1
                      where s.id_tovar = s1.id_tovar and s.sklad_name != s1.sklad_name)