Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по запросу. / 6 сообщений из 6, страница 1 из 1
08.04.2014, 08:30:06
    #38607905
r901
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по запросу.
Добрый день.

Есть запрос:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
select
p.id,
cast(c.change_date as date) d1,
(case  when (select first 1 m.curr_id from money_accounts m where m.id=c.macc_id)=1 then
(macc.amount - (select sum(dpower(-1, c1.direct)*c1.amount) from carries c1, type_payments tp1 where c1.macc_id=c.macc_id and c1.change_date>=c.change_date and tp1.id = c1.type_id and c1.status_comiss=tp1.is_commission))
else
(
(macc.amount - (select sum(
(dpower(-1, c1.direct)*c1.amount)

) from carries c1, type_payments tp1 where c1.macc_id=c.macc_id and c1.change_date>=c.change_date and tp1.id = c1.type_id and c1.status_comiss=tp1.is_commission))
)
end
) incoming,
(
case  when (select first 1 m.curr_id from money_accounts m where m.id=c.macc_id)=1 then
(case c.direct when 2 then c.amount else 0 end)
end
)
kredit,
(
case  when (select first 1 m.curr_id from money_accounts m where m.id=c.macc_id)=1 then
(case c.direct when 1 then c.amount else 0 end)
else
(case c.direct when 1 then c.amount else 0 end)
end
)
debet,
c.id id1
from
  money_accounts macc, type_payments tp,clients c1,personal_accounts p,carries c
where macc.id = c.macc_id and tp.id = c.type_id and macc.pacc_id=p.id and p.client_id=c1.id
and c.status_comiss=tp.is_commission
and macc.curr_id=1 and macc.cd=3
order by
c.macc_id
,c.change_date,c.id




Он возвращает:
Код: plsql
1.
2.
3.
4.
5.
id d1 incoming kredit debet id1
3454 31.05.2013 0 1392388,71 0 8461 
3454 31.05.2013 1392388,71 0 1392388,71 8471
3454 25.07.2013 0 9500000 0 8483
3454 25.07.2013 9500000 0 9500000 8484 


............

Не подскажете как выбрать записи для каждого дня с максимальным id1,
т.е, чтобы получилось:
Код: plsql
1.
2.
3.
id d1 incoming kredit debet id1
3454 31.05.2013 1392388,71 0 1392388,71 8471
3454 25.07.2013 9500000 0 9500000 8484 


.........
или подсчитать конечный остаток(incoming+ kredit-debet) на каждый день,
т.е, чтобы получилось:
Код: plsql
1.
2.
3.
id d1 outcoming 
3454 31.05.2013 0 
3454 25.07.2013 0 


.......
...
Рейтинг: 0 / 0
08.04.2014, 08:47:00
    #38607913
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по запросу.
r901,

у вас оракел или фаербирд?
...
Рейтинг: 0 / 0
08.04.2014, 09:38:37
    #38607950
r901
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по запросу.
фаербирд у меня
...
Рейтинг: 0 / 0
08.04.2014, 10:04:04
    #38607983
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по запросу.
В неявных соединениях даже разбираться не хочется.
Пропагандирую явные соединения!
...
Рейтинг: 0 / 0
08.04.2014, 10:08:17
    #38607988
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по запросу.
r901,

автор
Код: sql
1.
2.
3.
4.
      WHEN (SELECT FIRST 1
                M.CURR_ID
            FROM MONEY_ACCOUNTS M
            WHERE M.ID = C.MACC_ID) = 1



first без order by может быть весьма непредсказуем

в запрос не вникал, но по второму варианту приблизительно так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
WITH T AS (
SELECT
    P.ID AS ID,
    C.MACC_ID AS MACC_ID,
    CAST(C.CHANGE_DATE AS DATE) AS D1,
    (
    CASE
      WHEN (SELECT FIRST 1
                M.CURR_ID
            FROM MONEY_ACCOUNTS M
            WHERE M.ID = C.MACC_ID) = 1
      THEN (MACC.AMOUNT - (SELECT
                               SUM(DPOWER(-1, C1.DIRECT) * C1.AMOUNT)
                           FROM CARRIES C1, TYPE_PAYMENTS TP1
                           WHERE C1.MACC_ID = C.MACC_ID AND
                                 C1.CHANGE_DATE >= C.CHANGE_DATE AND
                                 TP1.ID = C1.TYPE_ID AND
                                 C1.STATUS_COMISS = TP1.IS_COMMISSION))
      ELSE ((MACC.AMOUNT - (SELECT
                                SUM((DPOWER(-1, C1.DIRECT) * C1.AMOUNT)

                                )
                            FROM CARRIES C1, TYPE_PAYMENTS TP1
                            WHERE C1.MACC_ID = C.MACC_ID AND
                                  C1.CHANGE_DATE >= C.CHANGE_DATE AND
                                  TP1.ID = C1.TYPE_ID AND
                                  C1.STATUS_COMISS = TP1.IS_COMMISSION)))
    END) AS INCOMING,
    (
    CASE
      WHEN (SELECT FIRST 1
                M.CURR_ID
            FROM MONEY_ACCOUNTS M
            WHERE M.ID = C.MACC_ID) = 1
      THEN (CASE
              WHEN C.DIRECT = 2
              THEN C.AMOUNT
              ELSE 0
            END)
    END) AS KREDIT,
    (
    CASE
      WHEN (SELECT FIRST 1
                M.CURR_ID
            FROM MONEY_ACCOUNTS M
            WHERE M.ID = C.MACC_ID) = 1
      THEN (CASE C.DIRECT
              WHEN 1
              THEN C.AMOUNT
              ELSE 0
            END)
      ELSE (CASE C.DIRECT
              WHEN 1
              THEN C.AMOUNT
              ELSE 0
            END)
    END) AS DEBET,
    C.ID AS ID1
FROM
  CARRIES C
  JOIN MONEY_ACCOUNTS MACC ON MACC.ID = C.MACC_ID
  JOIN TYPE_PAYMENTS TP ON TP.ID = C.TYPE_ID AND C.STATUS_COMISS = TP.IS_COMMISSION
  JOIN PERSONAL_ACCOUNTS P ON MACC.PACC_ID = P.ID
  JOIN CLIENTS C1 ON P.CLIENT_ID = C1.ID
WHERE
      MACC.CURR_ID = 1 AND
      MACC.CD = 3)
SELECT ID,
       D1,
       SUM(INCOMING + KREDIT - DEBET) AS OUTCOMING
FROM T
GROUP BY ID, D1
--ORDER BY C.MACC_ID, C.CHANGE_DATE, C.ID
...
Рейтинг: 0 / 0
08.04.2014, 12:41:43
    #38608303
r901
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по запросу.
Вот тот большой запрос не подошёл неправильно посчитал остаток на конец дня , а по первому варианту, что-то непонятно как сделать нужно.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по запросу. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]