Гость
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Справочник SQL запросов / 17 сообщений из 17, страница 1 из 1
11.12.2011, 12:36
    #37569562
Справочник SQL запросов
Всем привет!
На данный момент имеется таблица приблизительно такого вида:

Код: plaintext
1.
2.
Раздел, подраздел, подподраздел, сумма, описание.
Например:
2222      1111         3                    11,25   деталь1

Из этой таблицы мне нужно выбирать только определенные поля и суммировать их. Т.к. возможно правила выборки будут меняться, решил создать справочник условий для запроса, практически такого же вида:

Код: plaintext
1.
2.
3.
Раздел, подраздел, подподраздел, описания выборки.
Пример:
2222      1111         3                   Детали №1
2222                                          Инструменталка

Запросы у меня выбирают сначала только те записи у которых указан только раздел, потом следующий запрос отбирает те, у которых указан раздел и подраздел и т.д. Потом они объединяются в один запрос оператором UNION. Вроде все чудесно, но есть проблема: некоторые условия (см. пример выше) дублируются, т.е. если я отберу данные согласно вышеуказанному первому условию, то получу общую сумму по первой детали, если по второму условию - общую сумму по всему разделу, в которой уже будет сидеть сумма Детали№1. И простое объединение запросов показывает общую сумму больше, т.к. информация дублируется.
Вопрос.
Как сделать так, чтобы в запросе одно отнималось от другого. Или может я пошел не по правильному пути. Или может предложите другую форму и структуру справочника. В общем, натолкните на мысль, плиз!
Спасибо.
...
Рейтинг: 0 / 0
12.12.2011, 12:00
    #37570607
Infernal V. Raven
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
MINUS?
...
Рейтинг: 0 / 0
12.12.2011, 12:19
    #37570643
Справочник SQL запросов
Infernal V. Raven,
Да, но как именно отнять? Ведь условия могут меняться.
...
Рейтинг: 0 / 0
12.12.2011, 12:28
    #37570657
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
Можно придумать набор разных коэф. (1, 0, -1) и умножать на них: Field1 * koef1 * Field2 ......
...
Рейтинг: 0 / 0
12.12.2011, 16:17
    #37571182
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
Гарри любительКак сделать так, чтобы в запросе одно отнималось от другого. Или может я пошел не по правильному пути. Или может предложите другую форму и структуру справочника. В общем, натолкните на мысль, плиз!
Спасибо.

Ну я сделал "not in" :-)

Т.е.

select 1
union
select 2 (not in select 1)
union
select 3 (not in select1+select2)
...

и т.д.

Или Вы что-о другое имели ввиду?
...
Рейтинг: 0 / 0
12.12.2011, 19:10
    #37571548
Справочник SQL запросов
mad_nazgulГарри любительКак сделать так, чтобы в запросе одно отнималось от другого. Или может я пошел не по правильному пути. Или может предложите другую форму и структуру справочника. В общем, натолкните на мысль, плиз!
Спасибо.

Ну я сделал "not in" :-)

Т.е.

select 1
union
select 2 (not in select 1)
union
select 3 (not in select1+select2)
...

и т.д.

Или Вы что-о другое имели ввиду?

А можно поподробнее? Ведь справочник условий может меняться. И в итоговых запросах я применяю группировку, не могу сообразить как сделать по вашему условию.
...
Рейтинг: 0 / 0
13.12.2011, 10:05
    #37572244
donky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
Гарри любитель,

Вариант раз. Сливать ID отобранных записей во временную таблицу, чистить от дубликатов, потом join с основной таблицей и получение нужных сумм.

Вариант два. Я правильно понял, что все запросы идут к одной и той же таблице? Тогда почему не делать справочник условий в WHERE, который и применять в результирующем запросе?
...
Рейтинг: 0 / 0
14.12.2011, 06:37
    #37574449
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
[quot Гарри любитель]mad_nazgulпропущено...
А можно поподробнее? Ведь справочник условий может меняться. И в итоговых запросах я применяю группировку, не могу сообразить как сделать по вашему условию.

На сколько я понял у Вас есть
запрос1, запрос2, запрос3 и т.д.
Причем запрос2 может содержать данные из запроса1,
Запрос3 из запроса2 и т.д.
Я правильно понял?

Соответственно уже в запросе2 во where нужно указать ID not in (запрос1)
Запрос3 добавить во where ID not in (запрос1 + Запрос2)
И т.д.
ЗапросN лучше описать как хранимую процедуру с результатом типа курсор.
Я бы сделал бы так.
...
Рейтинг: 0 / 0
14.12.2011, 12:06
    #37574970
Справочник SQL запросов
mad_nazgul,
Спасибо, буду копать в данном направлении.
...
Рейтинг: 0 / 0
15.12.2011, 02:16
    #37576648
s_ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
Гарри любитель,
DISTINCT - думаю поможет
вы ведь отбираете сначала все нужные записи, а уже потом их суммируете?
...
Рейтинг: 0 / 0
15.12.2011, 08:28
    #37576738
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
Гарри любитель,

явно просматривается идея получения из таблицы1 укрупненных итогов в табл2

Разделподразделподподразделсумма описание.Инстументалкатокарн311деталь1Инстументалкаслесар210деталь1Инстументалкаслесар110Деталь2Инстументалкатокарн45Деталь31Инстументалкатокарн45Деталь32Инстументалкаслесар25Деталь33Инстументалкатокарн45Деталь33

РазделусловиесуммаИнстументалкадеталь121ИнстументалкаДеталь210ИнстументалкаПрочие детали20Инстументалкаитого51
...
Рейтинг: 0 / 0
15.12.2011, 08:43
    #37576746
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
Гарри любитель,

или даже
РазделусловиеПодразделсуммаИнстументалкадеталь1токарн11слесарн10итого21ИнстументалкаДеталь2токарн0слесарн10итого10ИнстументалкаПрочие деталитокарн5слесарн5Прочие обработки10итого20Инстументалкаитоготокарн16слесарн25Прочие обработки10итого51
...
Рейтинг: 0 / 0
15.12.2011, 14:11
    #37577567
s_ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
Гарри любитель,
Вот как выглядит заготовка:

Select sum(сумма) as результат /*получаем нужную сумму*/
From (
Select DISTINCT * /*убираем задублированные строки - остаются только уникальные записи*/
From (
select 1 /*несколькими запросами выбираем нужные нам строки, при этом много дублей*/

UNION

select 2

UNION

select 3

UNION

.................

UNION

select N
)
);
...
Рейтинг: 0 / 0
17.12.2011, 23:05
    #37581389
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
s_ustinov,

UNION исключает повторные записи из результирующего набора. Distinct наверное не нужен. Но если в исходных данных есть дубли, то SUM их в итоге не посчитает. Тут нужен UNION ALL.

Вообще задача легко решается динамическим SQL. к sql запросу добавляеются условия, полученные из твоей таблицы (называется query by examle, фильтры из разных строк объединяются OR, фильтры в строке объединяются AND), и никакие дубли не всплывают.
...
Рейтинг: 0 / 0
17.12.2011, 23:31
    #37581404
s_ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
mcureenabUNION исключает повторные записи из результирующего набора. Distinct наверное не нужен. Но если в исходных данных есть дубли, то SUM их в итоге не посчитает.
я глянул стандарт, вы все сказали правильно - дубли должны убираться.

тогда не совсем понятна ситуация ТС:

Гарри любительЗапросы у меня выбирают сначала только те записи у которых указан только раздел, потом следующий запрос отбирает те, у которых указан раздел и подраздел и т.д. Потом они объединяются в один запрос оператором UNION. Вроде все чудесно, но есть проблема: некоторые условия (см. пример выше) дублируются, т.е. если я отберу данные согласно вышеуказанному первому условию, то получу общую сумму по первой детали, если по второму условию - общую сумму по всему разделу, в которой уже будет сидеть сумма Детали№1. И простое объединение запросов показывает общую сумму больше, т.к. информация дублируется.
может, его субд некорректно реализует стандарт, и надо в явном виде чистить от дублей...
...
Рейтинг: 0 / 0
18.12.2011, 12:35
    #37581647
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Справочник SQL запросов
s_ustinovтогда не совсем понятна ситуация ТС
может, его субд некорректно реализует стандарт, и надо в явном виде чистить от дублей...
ТСу давно пора уже назвать СУБД, чтобы не получать нереализуемых вариантов решения его проблемы...
...
Рейтинг: 0 / 0
19.12.2011, 11:19
    #37582638
Справочник SQL запросов
СУБД MS Access.
Всем спасибо за участие в решении проблемы.
Топик можно закрывать.
Отдельное спасибо за UNION и UNION ALL, не знал до этого их отличия)
...
Рейтинг: 0 / 0
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Справочник SQL запросов / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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