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

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

select from select в FireBird 2.0.1/2.1 [D7, FireBird 2.x]


Страницы:   1 2

Виталий Панасенко(дом) ©   (2008-04-14 13:58:00) 

Здравствуйте. Такой вот вопрос возник.Есть запрос
SELECT
A.NUM,
IIF(D.DOC_STATUS IS NULL, 0, D.DOC_STATUS) AS DOC_STATUS,
D.PERIOD_BEG,
D.period_end,
P.PLAST_ID,
P.PLAST_NAME,
D.SUMMA,
C.CLIENT_ID,
(select MONTHSBETWEEN from
SP_MONTHSBETWEEN(:P1, :P2))AS MONTHBETWEEN,
(select MONTHSBETWEEN*IIF(D.SUMMA IS NULL, 0, D.SUMMA) from
SP_MONTHSBETWEEN(:P1, :P2))AS FULLSUMMA
FROM
 ADDRESS A
LEFT JOIN DOC D
  ON(A.NUM=D.NUM_ID)
LEFT JOIN STATUS S
  ON(S.STATUS_ID=D.DOC_STATUS)
LEFT JOIN CLIENTS C
   ON (D.CLIENT_ID=C.CLIENT_ID)
LEFT JOIN  PLAST_TYPE P
   ON(P.PLAST_ID=A.PLAST_ID)
WHERE (D.PERIOD_BEG <= :P2) AND
     (D.PERIOD_END >= :P1) or ((D.doc_status = 0) or (d.doc_status is null))

Период - это строка в виде ГГГГММ. Работает он так, как мне нужно. Но мне вдобавок еще нужно эти данные потом сгруппировать (но не всегда, зависит от выбора оператора) по PLAST_ID и/или CLIENT_ID... Думаю "сделаю я выборку из выборки"... в итоге получаем не верный результат. поле FULLSUMMA = первой записи из приведенного запроса... при попытке сгруппировать
select doc_status,  count(doc_status) as cnt, sum(fullsumma) as fullsumma from(
SELECT
количество подсчитывается правильно, а вот сумма!..там фантастические результаты. Заворачиваю подзапрос в ХП, выполняю - результат такой, какой и ожидался, правильный... SP_MONTHSBETWEEN - ХП расчитывает кол-во месяцев между начальным и конечным периодом...
Я то хранимку сделал..Но интересно - почему без нее получаю неверный результат(проверить просто - из 1313 записей, только у 3 есть и должно быть значение в поле FULLSUMMA, сложить смог.:-) )


Виталий Панасенко(дом)   (2008-04-14 16:18:00) [21]

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_MONTHSBETWEEN (
   period varchar(6),
   period2 varchar(6))
returns (
   monthsbetween smallint)
as
declare variable d date;
declare variable sd varchar(10);
declare variable i smallint;
begin
 /* Procedure Text */
D = cast(substring(:PERIOD from 1 for 4)||'-'||substring(:PERIOD from 5 for 2)||'-'||'28' as date);
I = 0;
while (SUBSTRING(CAST(:D AS varchar (10)) FROM 1 FOR 4)||SUBSTRING(CAST(:D AS varchar(10)) from 6 for 2)<=:PERIOD2) do
 begin
    SD = cast(:D as varchar(10));
    D = cast(substring(:SD from 1 for 4)||'-'||substring(:SD from 6 for 2)||'-'||'28' as date);
    D = :D+4;
    I = :I+1;
 end
 monthsbetween = :I;
 suspend;
end^

SET TERM ; ^


Johnmen   (2008-04-14 14:54:00) [22]

Можно глянуть на процедуру получения разницы дат в месяцах?


Страницы:   1 2

Наверх

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