Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизЗатрудняюсь построить запрос Найти похожие ветки
← →
RebroFF (2006-12-11 13:39) [0]Добрый день.Есть 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 и в остаток попадает весь приход. Помогите реализовать. Заранее премного благодарен.
← →
Сергей М. © (2006-12-11 13:42) [1]Субд какая ?
← →
RebroFF (2006-12-11 13:46) [2]
> Субд какая ?
Вообще-то это АРМ, написанный не мной. Запрос нужен просто для печати отчёта определённого вида. Подключаюсь к фокспрошной базе через BDE.
← →
Сергей М. © (2006-12-11 13:54) [3]А почему бы не сделать все необходимые расчеты прямо в своем клиентском приложении ?
← →
RebroFF (2006-12-11 13:57) [4]Тоже выход, но хотелось бы через запрос... Это реально?
← →
Сергей М. © (2006-12-11 14:15) [5]При объединении "один к одному" не реально.
← →
RebroFF (2006-12-11 14:18) [6]Не подскажите, как поступить?
← →
Сергей М. © (2006-12-11 14:21) [7]У тебя, надо понимать, учет не партионный ?
← →
novill © (2006-12-11 14:21) [8]А такая конструкция подойдет?
select ... a.Summ - coalasce(b.Summ,0) SummAB
from приход
left join расход
...
← →
Сергей М. © (2006-12-11 14:23) [9]
> novill © (11.12.06 14:21) [8]
Откуда в Фоксе возьмется coalasce ?
← →
novill © (2006-12-11 14:24) [10]вместо coalasce читать coalesce
* в твоей базе может носить другое имя. В крайнем случае через if реализуемо.
← →
RebroFF (2006-12-11 14:24) [11]
> учет не партионный
Не понял... А как это?
← →
novill © (2006-12-11 14:27) [12]> Откуда в Фоксе возьмется coalasce ?
В фоксе смотреть в сторону nvl и iif
← →
RebroFF (2006-12-11 14:27) [13]
> coalesce
"Insufficient memory for this operation"
← →
RebroFF (2006-12-11 14:31) [14]
> В фоксе смотреть в сторону nvl и iif
Насколько я знаю, IIF реализована только в TSQL
← →
Anatoly Podgoretsky © (2006-12-11 14:36) [15]> Сергей М. (11.12.2006 14:23:09) [9]
Но он и не в Фоксе испольняет, а в чем молчит. Если в Фоксе, то чего он делает на сайте по Дельфи
← →
Sergey13 © (2006-12-11 14:36) [16]А всего лишь добавив в поле SUM знак можно было бы избавить себя от здоровенного гемороя.
← →
Сергей М. © (2006-12-11 14:40) [17]
> Не понял... А как это?
Списание (расход) осуществляется со ссылкой на конкретную партию оприходованной номенклатуры.
← →
Сергей М. © (2006-12-11 14:44) [18]
> Anatoly Podgoretsky © (11.12.06 14:36) [15]
Он, как я понял, пытается реализовать сабж средствами стандартного фоксового драйвера (не ОDBC и не OLEDB) в составе BDE.
Могу ошибаться, но этот драйвер в части SQL-возможностей не реализует функциональности условного преобразования Null в 0.
← →
RebroFF (2006-12-11 14:49) [19]
> А всего лишь добавив в поле SUM знак можно было бы избавить
> себя от здоровенного гемороя.
База проектировалась не мной.
> Могу ошибаться, но этот драйвер в части SQL-возможностей
> не реализует функциональности условного преобразования Null
> в 0.
Ага, не реализует...
> Списание (расход) осуществляется со ссылкой на конкретную
> партию оприходованной номенклатуры.
Да
← →
Anatoly Podgoretsky © (2006-12-11 14:50) [20]> Сергей М. (11.12.2006 14:44:18) [18]
Телепатия, но в данном случае никакие функции Фокса не используются, а используется SQL-92 его подмножество.
← →
RebroFF (2006-12-11 14:54) [21]
> Телепатия
Никак нет. Уже уточнял: с базой работаю с использованием стандартных драйверов BDE, набор данных: TQuery
← →
Сергей М. © (2006-12-11 14:55) [22]
> RebroFF (11.12.06 14:49) [19]
> Да
Тогда не понятно, почему ты не используешь для связи расходов с приходами соответствующие ссылочные данные ... При партионном учете они должно при сутствовать в том или ином виде.
← →
RebroFF (2006-12-11 14:55) [23]Помогите. Правда, очень надо.
← →
RebroFF (2006-12-11 14:58) [24]
> соответствующие ссылочные данные
Ошибся. Никаких ссылок нет. Связь между приходом и расходом только по соотв. номенклатурному номеру.
← →
Сергей М. © (2006-12-11 14:58) [25]
> в данном случае никакие функции Фокса не используются, а используется
> SQL-92 его подмножество.
Тем более.
Так что про coalesce и иже с ними можно смело забыть.
← →
novill © (2006-12-11 14:58) [26]> [14] RebroFF (11.12.06 14:31)
Так выясни какими средствами располагает ТВОЙ драйвер!
← →
RebroFF (2006-12-11 15:04) [27]
> Так что про coalesce и иже с ними можно смело забыть.
А про что же всё-таки нужно вспомнить?
← →
novill © (2006-12-11 15:07) [28]> А про что же всё-таки нужно вспомнить?
А функция if для полей у тебя есть?
← →
Сергей М. © (2006-12-11 15:11) [29]
> RebroFF (11.12.06 15:04) [27]
Мое предложение остается в силе - выполняешь два отдельных запроса, суммирующих соответственно требуемые приходы и расходы, а разницу расчитываешь в кл.приложении
← →
Anatoly Podgoretsky © (2006-12-11 15:19) [30]Не coalesce, ни if, ни какие другие функции не применимы.
Синтаксис очень хорошо расписан в справке по LocalSql
← →
Сергей М. © (2006-12-11 15:20) [31]
> novill © (11.12.06 15:07) [28]
Ну нет в sql-92 никаких if"ов, coalesce, nvl и иже с ними)
Все это фигурирует или в более поздних версиях sql-стандарта либо в тех или иных диалектах.. В случае с фоксовым драйвером в составе БДЕ ни о том ни о другом речи не идет
← →
Anatoly Podgoretsky © (2006-12-11 15:25) [32]> Сергей М. (11.12.2006 15:11:29) [29]
Это единственное, что будет в данной ситуации работать.
Но можно и один запрос с left join и далее все равно на клиенте, вот там даже if не потребуется если использовать TNumericField.AsInteger/Float/...
← →
RebroFF (2006-12-11 15:27) [33]
> Мое предложение остается в силе - выполняешь два отдельных
> запроса, суммирующих соответственно требуемые приходы и
> расходы, а разницу расчитываешь в кл.приложении
Деваться некуда...
← →
Сергей М. © (2006-12-11 15:28) [34]
> Деваться некуда
Да уж...
лодка-то - подводная)
← →
RebroFF (2006-12-11 15:28) [35]
> Но можно и один запрос с left join и далее все равно на
> клиенте, вот там даже if не потребуется если использовать
> TNumericField.AsInteger/Float/...
А поподробнее можно?
← →
RebroFF (2006-12-11 15:29) [36]
> Да уж...
> лодка-то - подводная)
Лодка обычная, но в открытом море:)
← →
novill © (2006-12-11 15:33) [37]> [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:36) [38]
> А почему тебе не сделать просто вычислимое поле?
Например...
← →
novill © (2006-12-11 15:40) [39]Calculating fields
+
F1
← →
RebroFF (2006-12-11 15:41) [40]
> Calculating fields
> +
> F1
Нет, что такое вычисляемые поля я в курсе, но как это применимо в данной ситуации?
← →
Anatoly Podgoretsky © (2006-12-11 15:50) [41]> RebroFF (11.12.2006 15:41:40) [40]
Применительно к твоей ситуации - создаешь запрос с соединенением, а на него вешаешь вычислимое поле на клиенте
fld := SumA +/- SumB
← →
novill © (2006-12-11 15:53) [42]> это применимо в данной ситуации?
В запросе пользуешь 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:58) [43]> novill (11.12.2006 15:53:42) [42]
Для As фукнкций проверка не нужна, вернет 0 или значение.
← →
RebroFF (2006-12-11 16:16) [44]
> novill
Благодарю.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.045 c