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

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
msa
Сообщения: 2
Зарегистрирован: 12 фев 2007, 23:56

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

Сообщение msa » 13 фев 2007, 00:02

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

barabo
Сообщения: 1
Зарегистрирован: 13 фев 2007, 03:18

Сообщение barabo » 13 фев 2007, 03:32

Список товаров, кот. привязаны только к 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-х и т.д. меняя одну цифру

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 13 фев 2007, 09:03

Могу предложить такое безобразие:

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

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 конечно можно и получше оптимизировать.

msa
Сообщения: 2
Зарегистрирован: 12 фев 2007, 23:56

Сообщение msa » 13 фев 2007, 17:11

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 фев 2007, 18:19

Вот ещё вариант.

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

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)

Ответить