|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
Всем привет! На данный момент имеется таблица приблизительно такого вида: Код: plaintext 1. 2.
Из этой таблицы мне нужно выбирать только определенные поля и суммировать их. Т.к. возможно правила выборки будут меняться, решил создать справочник условий для запроса, практически такого же вида: Код: plaintext 1. 2. 3.
Запросы у меня выбирают сначала только те записи у которых указан только раздел, потом следующий запрос отбирает те, у которых указан раздел и подраздел и т.д. Потом они объединяются в один запрос оператором UNION. Вроде все чудесно, но есть проблема: некоторые условия (см. пример выше) дублируются, т.е. если я отберу данные согласно вышеуказанному первому условию, то получу общую сумму по первой детали, если по второму условию - общую сумму по всему разделу, в которой уже будет сидеть сумма Детали№1. И простое объединение запросов показывает общую сумму больше, т.к. информация дублируется. Вопрос. Как сделать так, чтобы в запросе одно отнималось от другого. Или может я пошел не по правильному пути. Или может предложите другую форму и структуру справочника. В общем, натолкните на мысль, плиз! Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2011, 12:36 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
Infernal V. Raven, Да, но как именно отнять? Ведь условия могут меняться. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 12:19 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
Можно придумать набор разных коэф. (1, 0, -1) и умножать на них: Field1 * koef1 * Field2 ...... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 12:28 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
Гарри любительКак сделать так, чтобы в запросе одно отнималось от другого. Или может я пошел не по правильному пути. Или может предложите другую форму и структуру справочника. В общем, натолкните на мысль, плиз! Спасибо. Ну я сделал "not in" :-) Т.е. select 1 union select 2 (not in select 1) union select 3 (not in select1+select2) ... и т.д. Или Вы что-о другое имели ввиду? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 16:17 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
mad_nazgulГарри любительКак сделать так, чтобы в запросе одно отнималось от другого. Или может я пошел не по правильному пути. Или может предложите другую форму и структуру справочника. В общем, натолкните на мысль, плиз! Спасибо. Ну я сделал "not in" :-) Т.е. select 1 union select 2 (not in select 1) union select 3 (not in select1+select2) ... и т.д. Или Вы что-о другое имели ввиду? А можно поподробнее? Ведь справочник условий может меняться. И в итоговых запросах я применяю группировку, не могу сообразить как сделать по вашему условию. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2011, 19:10 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
Гарри любитель, Вариант раз. Сливать ID отобранных записей во временную таблицу, чистить от дубликатов, потом join с основной таблицей и получение нужных сумм. Вариант два. Я правильно понял, что все запросы идут к одной и той же таблице? Тогда почему не делать справочник условий в WHERE, который и применять в результирующем запросе? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2011, 10:05 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
[quot Гарри любитель]mad_nazgulпропущено... А можно поподробнее? Ведь справочник условий может меняться. И в итоговых запросах я применяю группировку, не могу сообразить как сделать по вашему условию. На сколько я понял у Вас есть запрос1, запрос2, запрос3 и т.д. Причем запрос2 может содержать данные из запроса1, Запрос3 из запроса2 и т.д. Я правильно понял? Соответственно уже в запросе2 во where нужно указать ID not in (запрос1) Запрос3 добавить во where ID not in (запрос1 + Запрос2) И т.д. ЗапросN лучше описать как хранимую процедуру с результатом типа курсор. Я бы сделал бы так. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2011, 06:37 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
mad_nazgul, Спасибо, буду копать в данном направлении. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2011, 12:06 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
Гарри любитель, DISTINCT - думаю поможет вы ведь отбираете сначала все нужные записи, а уже потом их суммируете? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2011, 02:16 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
Гарри любитель, явно просматривается идея получения из таблицы1 укрупненных итогов в табл2 Разделподразделподподразделсумма описание.Инстументалкатокарн311деталь1Инстументалкаслесар210деталь1Инстументалкаслесар110Деталь2Инстументалкатокарн45Деталь31Инстументалкатокарн45Деталь32Инстументалкаслесар25Деталь33Инстументалкатокарн45Деталь33 РазделусловиесуммаИнстументалкадеталь121ИнстументалкаДеталь210ИнстументалкаПрочие детали20Инстументалкаитого51 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2011, 08:28 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
Гарри любитель, или даже РазделусловиеПодразделсуммаИнстументалкадеталь1токарн11слесарн10итого21ИнстументалкаДеталь2токарн0слесарн10итого10ИнстументалкаПрочие деталитокарн5слесарн5Прочие обработки10итого20Инстументалкаитоготокарн16слесарн25Прочие обработки10итого51 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2011, 08:43 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
Гарри любитель, Вот как выглядит заготовка: Select sum(сумма) as результат /*получаем нужную сумму*/ From ( Select DISTINCT * /*убираем задублированные строки - остаются только уникальные записи*/ From ( select 1 /*несколькими запросами выбираем нужные нам строки, при этом много дублей*/ UNION select 2 UNION select 3 UNION ................. UNION select N ) ); ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2011, 14:11 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
s_ustinov, UNION исключает повторные записи из результирующего набора. Distinct наверное не нужен. Но если в исходных данных есть дубли, то SUM их в итоге не посчитает. Тут нужен UNION ALL. Вообще задача легко решается динамическим SQL. к sql запросу добавляеются условия, полученные из твоей таблицы (называется query by examle, фильтры из разных строк объединяются OR, фильтры в строке объединяются AND), и никакие дубли не всплывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2011, 23:05 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
mcureenabUNION исключает повторные записи из результирующего набора. Distinct наверное не нужен. Но если в исходных данных есть дубли, то SUM их в итоге не посчитает. я глянул стандарт, вы все сказали правильно - дубли должны убираться. тогда не совсем понятна ситуация ТС: Гарри любительЗапросы у меня выбирают сначала только те записи у которых указан только раздел, потом следующий запрос отбирает те, у которых указан раздел и подраздел и т.д. Потом они объединяются в один запрос оператором UNION. Вроде все чудесно, но есть проблема: некоторые условия (см. пример выше) дублируются, т.е. если я отберу данные согласно вышеуказанному первому условию, то получу общую сумму по первой детали, если по второму условию - общую сумму по всему разделу, в которой уже будет сидеть сумма Детали№1. И простое объединение запросов показывает общую сумму больше, т.к. информация дублируется. может, его субд некорректно реализует стандарт, и надо в явном виде чистить от дублей... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2011, 23:31 |
|
Справочник SQL запросов
|
|||
---|---|---|---|
#18+
s_ustinovтогда не совсем понятна ситуация ТС может, его субд некорректно реализует стандарт, и надо в явном виде чистить от дублей... ТСу давно пора уже назвать СУБД, чтобы не получать нереализуемых вариантов решения его проблемы... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2011, 12:35 |
|
|
start [/forum/topic.php?fid=33&msg=37581647&tid=1547934]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 298ms |
total: | 436ms |
0 / 0 |