![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL-запрос [D7, IB6.x]
ligor © (2004-07-01 16:03:00)Добрый день Мастера Delphi
Подскажите можно ли в запросе подсчитать сумму,
если приход помечен "П", а расход "Р"
Пример
Id Summ KodPl
1 10 П
2 20 П
3 15 Р
4 8 П
5 22 Р
Соловьев (2004-07-02 12:47:00) [1]Вот так правильно:
select sum(case kodpl when 'П' then Summ when 'Р' then Summ -Summ end)
from table
Соловьев (2004-07-02 12:43:00) [2]
> чтобы не учитывать 'О':
select sum(case when when kodpl='П' then Summ where kodpl='Р' then -Summend)
from table
Danilka (2004-07-02 12:40:00) [3]как не самый лучший вариант, чтобы не учитывать 'О':
select sum(case when when kodpl='П' then Summ else -Summ end)
from table t1
where exists (select 1 from table where id = t1.id and kodpl in ('П', 'Р'))
:))
Sandman25 (2004-07-02 12:30:00) [4]ср.
if FieldByName('kodPl').AsInteger = 1 then
...
// без else!
if FieldByName('kodPl').AsInteger = 2 then
..
и
case FieldByName('kodPl').AsInteger of
1: ...
2: ...
во втором случае анализируется либо 1 либо 2 раза, причем нет второго обращения к DataSet. Даже если оптимизатор заменяет первый случай на
LocalVar := FieldByName('kodPl').AsInteger;
if LocalVar = 1 then
...
// без else!
if LocalVar = 2 then
все равно имеем проигрыш из-за того, что сравнений в среднем 2, а не 1.5 как в моем варианте :)
Курдль (2004-07-02 12:27:00) [5]
> Sandman25 © (02.07.04 12:23) [40]
> [39] Johnmen © (02.07.04 12:19)
>
> А кто мешает написать
> select sum(case kodpl when 'П' then Summ when 'Р' -Summ
> else 0 end)
> from table
АднАзнАчнА!!! Просто лень было подумать :) Но ведь насколько лучше, чем варивнты с ХП, ХЗ и ТП?!
Johnmen (2004-07-02 12:26:00) [6]>Sandman25 © (02.07.04 12:23) [40]
>А кто мешает написать...
А это уже "KodPl будет анализироваться дважды"
:)
>Просто [17] работает быстрее
Разумно ли экономить на спичках в данном случае ?
Sandman25 (2004-07-02 12:23:00) [7][39] Johnmen © (02.07.04 12:19)
А кто мешает написать
select sum(case kodpl when 'П' then Summ when 'Р' -Summ else 0 end)
from table
Просто [17] работает быстрее, а если мы имеем check(kodPl in 'П', 'Р'), то 100% надежно.
Johnmen (2004-07-02 12:19:00) [8]>Sandman25 © (02.07.04 12:17) [38]
Зато застрахованы от чешуи типа KodPl = 'О'
:)
Sandman25 (2004-07-02 12:17:00) [9][37] Курдль © (02.07.04 12:11)
В обоих случаях KodPl будет анализироваться дважды. Сравните с [17]
Курдль (2004-07-02 12:11:00) [10]Это был синтаксис ХП на моем собственном языке моей собственной СУБД
Если уж дело дошло до предложений о смене СУБД, вот 2 варианта на выбор:
select sum(decode KodPl = 'П', Summ, 0) - sum(decode KodPl = 'P', Summ, 0) from Table_1
или
select sum(if KodPl = 'П' then Summ else 0 endif) - sum(if KodPl = 'P' then Summ else 0 endif) from Table_1
Sandman25 (2004-07-02 12:03:00) [11][35] Deniz © (02.07.04 12:00)
Каких еще опечаток? Это был синтаксис ХП на моем собственном языке моей собственной СУБД, я с IB много лет не работал :)
Deniz (2004-07-02 12:00:00) [12]> Johnmen © (02.07.04 09:11) [30]
Опечатка вышла, с кем не бывает ;-) но ведь в процедуре Sandman25 © (01.07.04 17:04) [23]их(опечаток) намного больше.
> Соловьев © (02.07.04 09:23) [32]
Добавлю что в некоторых случаях с IB6.x на FB1.5 даже можно просто скопировать базу.
Sandman25 (2004-07-02 09:31:00) [13][33] Johnmen © (02.07.04 09:27)
О том, что = не работает с null? Тогда извиняюсь :)
Johnmen (2004-07-02 09:27:00) [14]>Sandman25 © (02.07.04 09:16) [31]
Я о другом...:)
Соловьев (2004-07-02 09:23:00) [15]
> Пробовал по рекомедациям
> перевести базу на FB1.5
> все заглючело и перестало работать
> (скорее всего глючу сам, опыт работы очень маленький ну
> очень)
> Пробавал ставить этот сервер дома все пршло успешно
> а вот на работе где много уже работающих программ не
> получается :-((((
я переводил свои БД с ИБ на ФБ - бекап/ресторе только делал. И все работает. А какие траблы , какие глюки возникли?
Sandman25 (2004-07-02 09:16:00) [16][30] Johnmen © (02.07.04 09:11)
if (tmpSumm <> 0) then begin
:)
Johnmen (2004-07-02 09:11:00) [17]>Deniz © (02.07.04 08:43) [28]
>if (not (tmpSumm = null)) then begin
if (not tmpSumm is null) then begin
:)
Sandman25 (2004-07-02 09:09:00) [18][28] Deniz © (02.07.04 08:43)
Что один проход - принимается.
Что тоже достаточно наглядно - отнюдь.
Deniz (2004-07-02 08:43:00) [19]> Sandman25 © (01.07.04 17:04) [23]
Ну уж процедуру то надо по другому писать :-(
summa = 0;
for select summ, KodPl from table into :tmpSumm, :tmpKod do begin
if (not (tmpSumm = null)) then begin
if (tmpKod = 'Р') then tmpSumm = -tmpSumm;
summa = summa + tmpSumm;
end
end
suspend;
Тоже достаточно наглядно и один проход.
Fay (2004-07-01 18:34:00) [20]Быват