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

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

SQL-запрос [D7, IB6.x]


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

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]

Быват


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

Наверх

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