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

Вниз

select from select в FireBird 2.0.1/2.1   Найти похожие ветки 

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

Здравствуйте. Такой вот вопрос возник.Есть запрос
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, сложить смог.:-) )


 
Johnmen ©   (2008-04-14 14:54) [1]

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


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

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 16:50) [3]

Прочёл внимательней [0].
Чтобы получить разницу в месяцах УДФ не нужна. Просто используй EXTRACT(MONTH ...


 
Johnmen ©   (2008-04-14 16:55) [4]

Т.е. ХП не нужна... :))


 
Виталий Панасенко(дом)   (2008-04-14 19:07) [5]


> Johnmen ©   (14.04.08 16:50) [3]
>
> Прочёл внимательней [0].
> Чтобы получить разницу в месяцах УДФ не нужна. Просто используй
> EXTRACT(MONTH ...

это я не понял... насчет извлечения месяца(EXTRACT(MONTH...))... дата нигде не мелькает(в данном случае).. да и ответ не в тему: почему select from select выдает неправильный результат... глюк ПрицЫ ?  или мой ? я со своей строно не заметил...и конструкцию select from (select) воспринимаю буквально: внутренний select - это таблица для внешнего.. оказалось, не совсем


 
Виталий Панасенко(дом)   (2008-04-14 19:08) [6]


> Johnmen ©   (14.04.08 16:55) [4]
>
> Т.е. ХП не нужна... :))
>

а разница ?


 
Johnmen ©   (2008-04-14 19:27) [7]


> Виталий Панасенко(дом)   (14.04.08 19:07) [5]
> это я не понял... насчет извлечения месяца(EXTRACT(MONTH...))... дата
> нигде не мелькает(в данном случае)..

Так пусть мелькает. Притом это проще, чем мелькать "ГГГГММ"

>  да и ответ не в тему

Ну если тебе это не интересно, то мне и подавно.

> почему select from select выдает неправильный результат...

Должен заметить, что ты нигде не привел этого. И над чем мы должны думать?


 
Виталий Панасенко(дом)   (2008-04-14 19:31) [8]

а если тему и первый пост мой перечитать?
> select from select в FireBird 2.0.1/2.1 [D7, FireBird 2.
> x]


> Думаю "сделаю я выборку из выборки"


 
Johnmen ©   (2008-04-14 19:35) [9]

Ну так приведи, как сделал-то. Не заставляй напрягаться наши изношенные телепаторы :)


 
Виталий Панасенко(дом)   (2008-04-14 20:55) [10]

вроде привел....

> select doc_status,  count(doc_status) as cnt, sum(fullsumma)
> as fullsumma from(
> SELECT количество подсчитывается правильно, а вот сумма!
>
</
далее

> 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))
>

то же из первого поста...


 
Johnmen ©   (2008-04-14 21:29) [11]

А как с помощью ХП? Доловно.


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


> Johnmen ©   (14.04.08 21:29) [11]
>
> А как с помощью ХП? Доловно.

Дословно?
select doc_status, sum(fullsumma) as fullsumma, count(doc_status) as cnt
from sp_statistic(:p1, :p2)
group by doc_status
работает.. и отбирает то что нужно.. я чего тему затронул: я не знаю, я "гоню" или сервер.. но если сервер, то м.б. разработчики обратят внимание на такую ситуацию.. а если я... то нафиг...:-)


 
Johnmen ©   (2008-04-14 22:33) [13]

Ещё - откуда берется :p1 и :p2 в случае запроса из запроса?


 
Виталий Панасенко(дом)   (2008-04-14 22:43) [14]


> Johnmen ©   (14.04.08 22:33) [13]

это параметры: начальный и конечный период


 
Johnmen ©   (2008-04-14 22:51) [15]


> Виталий Панасенко(дом)   (14.04.08 22:43) [14]

Для эксперимента попробуй явно задать значения.


 
Виталий Панасенко(дом)   (2008-04-15 09:55) [16]


> Johnmen ©   (14.04.08 22:51) [15]
>
>
> > Виталий Панасенко(дом)   (14.04.08 22:43) [14]
>
> Для эксперимента попробуй явно задать значения.
>

Не помогло


 
Johnmen ©   (2008-04-15 10:32) [17]


> Виталий Панасенко(дом)   (15.04.08 09:55) [16]
> Не помогло

Все-таки приведи конкретный код, как с явным заданием значений.


 
Виталий Панасенко(дом)   (2008-04-15 12:08) [18]

Ха! Когда убрал ХП из запроса - заработало!
select doc_status,  count(doc_status) as cnt, sum(fullsumma) as fullsumma from(
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,
1 AS MONTHBETWEEN, --- ТУТ БЫЛ ВЫЗОВ ХП
1*IIF(D.SUMMA IS NULL, 0, D.SUMMA) 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 <= "200801") AND
     (D.PERIOD_END >= "200801")) or ((D.doc_status = 0) or (d.doc_status is null)))
group by 1


 
Johnmen ©   (2008-04-15 12:34) [19]


> Виталий Панасенко(дом)   (15.04.08 12:08) [18]

1. С ХП с явными значениями работает?
2. Для получения разницы в месяцах никакая ХП не нужна - я уже говорил [3]


 
Виталий Панасенко(дом)   (2008-04-15 13:49) [20]


> Johnmen ©   (15.04.08 12:34) [19]


> 1. С ХП с явными значениями работает?

Нет... Когда значение, которое вычисляет ХП подставляется... в EXECUTE BLOCK/STORED PROC вычисляем разницу, в переменную, которую уже и использую в запросе

> 2. Для получения разницы в месяцах никакая ХП не нужна -
>  я уже говорил [3]
>

Честно, не понял, как...Вытащил я месяц из даты и что ?А то, что сделал сам - понимаю...:-)


 
Johnmen ©   (2008-04-15 14:03) [21]


> Виталий Панасенко(дом)   (15.04.08 13:49) [20]

1.
Т.е. так не работает (не работает в смысле[0])?
> C.CLIENT_ID,
> (select MONTHSBETWEEN from
> SP_MONTHSBETWEEN("200801","200801"))AS MONTHBETWEEN,
> (select MONTHSBETWEEN*IIF(D.SUMMA IS NULL, 0, D.SUMMA) from
> SP_MONTHSBETWEEN("200801","200801"))AS FULLSUMMA
> FROM

2.
Из даты вытаскивается год и месяц. Далее находим разницу.
12*(EXTRACT(YEAR FROM DateTimeField1)-EXTRACT(YEAR FROM DateTimeField2))+
(EXTRACT(MONTH FROM DateTimeField1)-EXTRACT(MONTH FROM DateTimeField2))


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


> 2.
> Из даты вытаскивается год и месяц. Далее находим разницу.
>
> 12*(EXTRACT(YEAR FROM DateTimeField1)-EXTRACT(YEAR FROM
> DateTimeField2))+
> (EXTRACT(MONTH FROM DateTimeField1)-EXTRACT(MONTH FROM DateTimeField2))

Красиво.. век живи....:-) Спасибо



Страницы: 1 вся ветка

Текущий архив: 2008.10.19;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.015 c
2-1220944731
Кирей
2008-09-09 11:18
2008.10.19
ошибка при работе с экселем OLE error 800A03EC


15-1219907036
vuk
2008-08-28 11:03
2008.10.19
03.09.08 - King Crimson Festival. Никто не собирается?


15-1219815088
Bob
2008-08-27 09:31
2008.10.19
Фокус на АСМе в Дельфи


15-1219834044
Riply
2008-08-27 14:47
2008.10.19
Отложенная запись.


2-1221125658
MdbPero
2008-09-11 13:34
2008.10.19
Использование Microsoft Agent