Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Затрудняюсь построить запрос [D7, 2000]


Страницы:   1 2 3

RebroFF ©   (2006-12-11 13:39:00) 

Добрый день.Есть dbf-таблица движения материалов. Поля sklad(цех), nom (номенклатурный номер),sum (сумма прихода или расхода), vid (определяет, чем явл. сумма:приходом или расходом. 40-расход, остальные значения-приход). Задача: выбрать только те записи, сгруппировав по номенклатурному номеру и по цехам, для которых остаток (приход-расход) >1000.
Запрос "sql40" (выбираем с видом 40):

SELECT nomer,sklad,
SUM(mtb60."sum") Summ
FROM mtb60
WHERE vid = "40"
GROUP BY nomer,sklad

Запрос "sqlnot40" (с видом не равным 40, т. е. приход):

SELECT nomer,sklad,
SUM(mtb60."sum") Summ, sum(kol) skol
FROM mtb60
WHERE vid<>"40"
GROUP BY nomer,sklad

Общий запрос:

SELECT
a.nomer, b.nomer,a.sklad,b.sklad,a.Summ SummA, b.Summ SummB, a.Summ - b.Summ SummAB,
FROM
"sumNot40.sql" a
JOIN "sum40.sql" b ON (a.nomer = b.nomer and a.sklad=b.sklad and a.sklad=:nomskl)
WHERE
a.Summ - b.Summ > 1000

Проблема в том, что, если по определённому номенк. номеру расхода не было, значит и нет соотв. записи для такого номера с видом "40", а значит a.Summ - b.Summ не имеет смысла. Но этом случае нужно считать расход равным 0 и в остаток попадает весь приход. Помогите реализовать. Заранее премного благодарен.


RebroFF   (2006-12-11 16:16:00) [1]


> novill

Благодарю.


Anatoly Podgoretsky   (2006-12-11 15:58:00) [2]

> novill  (11.12.2006 15:53:42)  [42]

Для As фукнкций проверка не нужна, вернет 0 или значение.


novill   (2006-12-11 15:53:00) [3]

> это применимо в данной ситуации?

В запросе пользуешь left join (Надеюсь он-то по стандарту есть!)
а проверку на null делаешь локально.
Примерно таким кодом

if QuerySummB.asvariant=null
then QueryMySumm.asfloat:=QuerySummA.Asfloat
else QueryMySumm.asfloat:=QuerySummA.Asfloat-QuerySummB. asfloat


Anatoly Podgoretsky   (2006-12-11 15:50:00) [4]

> RebroFF  (11.12.2006 15:41:40)  [40]

Применительно к твоей ситуации - создаешь запрос с соединенением, а на него вешаешь вычислимое поле на клиенте

fld := SumA +/- SumB


RebroFF   (2006-12-11 15:41:00) [5]


> Calculating fields
> +
> F1

Нет, что такое вычисляемые поля я в курсе, но как это применимо в данной ситуации?


novill   (2006-12-11 15:40:00) [6]

Calculating fields
+
F1


RebroFF   (2006-12-11 15:36:00) [7]


> А почему тебе не сделать просто вычислимое поле?

Например...


novill   (2006-12-11 15:33:00) [8]

> [30] Anatoly Podgoretsky ©   (11.12.06 15:19)


> [31] Сергей М. ©   (11.12.06 15:20)


Как всё хорошо, что не приходится на SQL92 работать :)

> [35] RebroFF   (11.12.06 15:28)

А почему тебе не сделать просто вычислимое поле?


RebroFF   (2006-12-11 15:29:00) [9]


> Да уж...
> лодка-то  - подводная)

Лодка обычная, но в открытом море:)


Сергей М.   (2006-12-11 15:28:00) [10]


> Деваться некуда


Да уж...
лодка-то  - подводная)


RebroFF   (2006-12-11 15:28:00) [11]


> Но можно и один запрос с left join и далее все равно на
> клиенте, вот там даже if не потребуется если использовать
> TNumericField.AsInteger/Float/...

А поподробнее можно?


RebroFF   (2006-12-11 15:27:00) [12]


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

Деваться некуда...


Anatoly Podgoretsky   (2006-12-11 15:25:00) [13]

> Сергей М.  (11.12.2006 15:11:29)  [29]

Это единственное, что будет в данной ситуации работать.
Но можно и один запрос с left join и далее все равно на клиенте, вот там даже if не потребуется если использовать TNumericField.AsInteger/Float/...


Сергей М.   (2006-12-11 15:20:00) [14]


> novill ©   (11.12.06 15:07) [28]


Ну нет в sql-92 никаких if'ов, coalesce, nvl и иже с ними)

Все это фигурирует или в более поздних версиях sql-стандарта либо в тех или иных диалектах.. В случае с фоксовым драйвером в составе БДЕ ни о том ни о другом речи не идет


Anatoly Podgoretsky   (2006-12-11 15:19:00) [15]

Не coalesce, ни if, ни какие другие функции не применимы.
Синтаксис очень хорошо расписан в справке по LocalSql


Сергей М.   (2006-12-11 15:11:00) [16]


> RebroFF   (11.12.06 15:04) [27]


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


novill   (2006-12-11 15:07:00) [17]

> А про что же всё-таки нужно вспомнить?

А функция if для полей у тебя есть?


RebroFF   (2006-12-11 15:04:00) [18]


> Так что про coalesce и иже с ними можно смело забыть.

А про что же всё-таки нужно вспомнить?


RebroFF   (2006-12-11 14:58:00) [19]


> соответствующие ссылочные данные

Ошибся. Никаких ссылок нет. Связь между приходом и расходом только по соотв. номенклатурному номеру.


Сергей М.   (2006-12-11 14:58:00) [20]


> в данном случае никакие функции Фокса не используются, а используется
> SQL-92 его подмножество.


Тем более.
Так что про coalesce и иже с ними можно смело забыть.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо