![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Затрудняюсь построить запрос [D7, 2000]
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 и иже с ними можно смело забыть.