Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Затрудняюсь построить запрос   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.032 c
2-1165735440
intel
2006-12-10 10:24
2006.12.31
Здравствуйте


15-1165809964
Slider007
2006-12-11 07:06
2006.12.31
С днем рождения ! 11 декабря


2-1165999682
sergeyst
2006-12-13 11:48
2006.12.31
Попадание точки в заданную область


2-1165902757
Mazer
2006-12-12 08:52
2006.12.31
Тренажор на клавиатуре по печатанию в слепую


2-1166025831
Pascalman
2006-12-13 19:03
2006.12.31
Подскажите пожалуйста как решить задачу: