меняющиеся, неменяющиеся

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

меняющиеся, неменяющиеся

Сообщение SLIM » 27.05.2009 (Ср) 21:21

В связи с работой пришлось мне делать один запрос.
Расскажу о сути

Есть таблица. В ней поля:
1. Дата
2. Магазин
3. Код позиции
4. Продажа в рублях
5. Продажа в штуках
6. Продажа в весе
7. Остаток на конец дня в штуках.


Задается период. Например месяц. Выбирается несколько позиций.
Сделать запрос, где все магазины сгруппируются на два типа
1. Остатки не меняются
2. Остатки меняются

Меняющиеся остатки - это те остатки, которые хоть как-то изменились в течение месяца.
Не меняющиеся - это те, которые соответственно не менялись с начала до конца месяца.

Необходимо сохранить разбивку по дням, т.е. у неменяющихся на определенном магазине остатков должна быть одна цифра на протяжении всего месяца каждый день.

Сам запрос я сделал, но работает он очень уж медленно, так как магазинов очень много. Запрос один, с вложенным. Примерно месяц высчитывается около часа.

Есть у кого-нибудь предложения самого оптимального запроса?
Пишите жизнь на чистовик.....переписать не удастся.....

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: меняющиеся, неменяющиеся

Сообщение trash » 28.05.2009 (Чт) 16:33

1) Какая база?
2) Покажи запрос.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: меняющиеся, неменяющиеся

Сообщение SLIM » 28.05.2009 (Чт) 19:24

trash писал(а):1) Какая база?
2) Покажи запрос.

База то особо не так важна. Важнее синтаксис SQL.
Ну а вообще MS SQL 2000, T-SQL

Запрос показать не могу - она на работе, а с работы выносить нельзя ничего, а писать сейчас по новой нет времени, как будет напишу.
Но логику могу рассказать.
Расскажу двумя запросами
1. Отбираем записи с таблицы все записи, одним полем будет разница между максимальным и минимальным значением остатка за период
2. Объединяем с таблицей полученные записи, в одном поле смотрим знак (SIGN) разницы (min-max) Если знак - 0, значит остатки не менялись (min=max), если +1 или -1, то остатки менялись.

Ну образно говоря
Код: Выделить всё
Select  SIGN(t.Признак), m.дата, m.остаток, m.магазин, m.[код товара]
from table as m inner join (select (min(Остаток)-max(Остаток))  as Признак, магазин, [код товара] from table) as t
                 on m.Магазин=t.магазин on m.[Код товара]=t.[Код товара]


Ну что-то типа этого. Точно написать не смогу. Главное логика
Пишите жизнь на чистовик.....переписать не удастся.....

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: меняющиеся, неменяющиеся

Сообщение trash » 29.05.2009 (Пт) 7:39

База то особо не так важна. Важнее синтаксис SQL.
А мужики-то думали, что синтаксис от базы зависит.

Код: Выделить всё
(select (min(Остаток)-max(Остаток))  as Признак, Year(Дата) год, Month(Дата) месяц, магазин  [код товара] from table group by магазин, Year(Дата), Month(Дата), [код товара]) as t
on m.Магазин=t.магазин AND m.[Код товара]=t.[Код товара] AND year(m.Дата) = t.год and month(m.дата)=t.месяц
Что за дурацкая манера давать русские названия полям? Это же ппц как не удобно.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: меняющиеся, неменяющиеся

Сообщение Andrey Fedorov » 29.05.2009 (Пт) 8:44

trash писал(а):Что за дурацкая манера давать русские названия полям? Это же ппц как не удобно.


Вообще-то это очень удобно - чем меньше думаешь что это за таблица/поле, тем лучше. Затраты на переключение раскладки - одно нажатие клавиши - меня это совсем не ломает. Зато хорошо понятно что содержится в поле - особенно это чувствуется когда сопровождаешь различные базы годами...

Другое дело когда база делается под заказ забугорного клиента - тогда лучше только английский...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: меняющиеся, неменяющиеся

Сообщение alibek » 29.05.2009 (Пт) 10:23

Не люблю использовать русские имена объектов.
Слова на русском языке обычно гораздо длиннее, нежели английские.
Да и некоторые фонемы уже практически стандартизированы, их русский перевод звучит непонятно, а транслитирование — неправильно.
Хотя в VIEW их и использую.
Lasciate ogni speranza, voi ch'entrate.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: меняющиеся, неменяющиеся

Сообщение HandKot » 29.05.2009 (Пт) 13:51

мой вклад
Код: Выделить всё
select
  t.[Дата],
  t.[Магазин],
  t.[Код позиции],
  t.[Остаток на конец дня в штуках],
  t1.[cnt]   --если 0, то не менялись остатки, иначе менялись
from
  Table t
inner join (
  select
    t1.[Магазин],
    t1.[Код позиции],
    count(distinct t1.[Остаток на конец дня в штуках])-1 as cnt
  from
    Table t1
  where
    t1.[Дата] between @date_b and @date_e
  group by
    t1.[Магазин],
    t1.[Код позиции]) t1 on t1.[Магазин] = t.[Магазин] and t1.[Код позиции] = t.[Код позиции]
where
  t1.[Дата] between @date_b and @date_e


и скорость запроса зависит от индексов на таблице.
в данном случае индекс нужен пос ледующим полям :
Код: Выделить всё
[Дата] + [Магазин] + [Код позиции]

и именно в том порядке, в котором они здесь написаны
I Have Nine Lives You Have One Only
THINK!

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: меняющиеся, неменяющиеся

Сообщение SLIM » 30.05.2009 (Сб) 10:48

Руссике имена только для показа.
На смом деле поля называются
Date (Ключ)
CODE (Ключ)
dkey(ключ, иднетифицирует магазин, используется специально для подсчетов, типа count)
Все остальные поля - обвязки вокруг ключей (читай индексов)
trash писал(а):А мужики-то думали, что синтаксис от базы зависит.

Хочешь сказать что например T-SQL может юзаться только в MS SQL? Глупости
HandKot писал(а):мой вклад

Хм...спасибо, нужно проверить. На первый взгляд должно работать
Хотя Distinct думаю скорости не прибавит. Нужно сравнить
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: меняющиеся, неменяющиеся

Сообщение SLIM » 30.05.2009 (Сб) 10:56

Задумался...здесь COUNT(DISTINCT...
Вообще неуместен помоему.
не понял смысла запроса...
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: меняющиеся, неменяющиеся

Сообщение alibek » 30.05.2009 (Сб) 13:06

SLIM писал(а):Хочешь сказать что например T-SQL может юзаться только в MS SQL?

Смотря как. Если сотня тысяч записей будет обрабатываться час, тогда конечно не зависит.
А когда запросы оптимизирует, то зависит не только от СУБД, но и от конкретной базы.
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: меняющиеся, неменяющиеся

Сообщение SLIM » 30.05.2009 (Сб) 17:39

alibek писал(а):Смотря как. Если сотня тысяч записей будет обрабатываться час, тогда конечно не зависит.
А когда запросы оптимизирует, то зависит не только от СУБД, но и от конкретной базы.

Согласен.

Alibek, долго ждал тебя в данном топике. Не желаешь присоединиться советом?
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: меняющиеся, неменяющиеся

Сообщение alibek » 30.05.2009 (Сб) 18:16

Остатки меняются, если были продажи.
Соответственно, тебе надо получить список записей, где были продажи, и список записей, где продаж не было.
Это будет два запроса, объединенных через UNION ALL.
Чтобы выводить записи для отсутствующих дней, создаешь временную таблицу, в которую добавляешь значения от 1 до 28|28|30|31. Эта таблица будет первой в джойне, остальные связываешь через left join.
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: меняющиеся, неменяющиеся

Сообщение SLIM » 30.05.2009 (Сб) 19:15

Хм..супер.
Есть идеи.

Можно отобрать записи с условием Продажи>0 в отдельную таблицу (или вложенным запросом)
Потом через Left outer joinn объединить с основной таблицей с условием продажи is null (из таблицы, которую только что сформировали). Тогда получится что мы как бы исключаем те позиции и те магазины, на которых продажи были. Можно выбрать эти записи в отдельную таблицу и уже именно их исключать из основной (полной) таблицы.

Alibek, ты подал мне замечательную идею....спасибо тебе.


З.Ы. Прокомментируй мою идею, может я что не так понял?
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: меняющиеся, неменяющиеся

Сообщение alibek » 30.05.2009 (Сб) 20:29

Я не уловил, что именно ты хочешь получить в результате.
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: меняющиеся, неменяющиеся

Сообщение SLIM » 30.05.2009 (Сб) 20:56

Ну результат я говорил.Две группы - одна неменяющиеся, вторая меняющиеся.
Просто ты подал мне идею играть с продажами а не с остатками.
Исходя из этого, можно исключать из общих записей те те или иные и объединять.
Пишите жизнь на чистовик.....переписать не удастся.....

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: меняющиеся, неменяющиеся

Сообщение trash » 01.06.2009 (Пн) 9:21

SLIM писал(а):
trash писал(а):А мужики-то думали, что синтаксис от базы зависит.

Хочешь сказать что например T-SQL может юзаться только в MS SQL? Глупости

select * from xxx
inner join yyy on yyy.zzz=xxx.zzz
inner join iii on iii.zzz=xxx.zzz
работает в mssql и не работает в access. Конечно глупости, ага.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: меняющиеся, неменяющиеся

Сообщение alibek » 01.06.2009 (Пн) 9:28

trash, по твоему в Access — это T-SQL?
Почитал бы ты, что такое Transact SQL.

Кроме того, запрос работает, просто джойны надо в круглые скобки заключать.
Lasciate ogni speranza, voi ch'entrate.

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: меняющиеся, неменяющиеся

Сообщение trash » 02.06.2009 (Вт) 10:10

alibek писал(а):trash, по твоему в Access — это T-SQL?
Почитал бы ты, что такое Transact SQL.
Изначально речи не было о T- SQL.
А мужики-то думали, что синтаксис от базы зависит.
Конечно, я имел ввиду СУБД.
Кроме того, запрос работает, просто джойны надо в круглые скобки заключать.
А скобки это уже не элемент синтаксиса?

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: меняющиеся, неменяющиеся

Сообщение SLIM » 03.06.2009 (Ср) 21:08

Блин, о чем спорт то?
СУБД не СУБД, синтаксис не синтаксис
Какая разница какая СУБД если известно что синтаксис T-SQL?
Может я вообще пользуюсь кустарной СУБД где тоже юзается T-SQL?
Пишите жизнь на чистовик.....переписать не удастся.....


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList