Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как написать запрос получения остатков склада / 3 сообщений из 3, страница 1 из 1
22.04.2016, 21:20
    #39222896
Delphi159
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать запрос получения остатков склада
На Firebird 2.5 server в БД есть таблицы: goods, income, sale.
Goods: goods_id, name
Income: Income_id, Goods_id, incomeqty (quantity), recdate
Sale: sales_id,income_id,Goods_id,saleqty,recdate

Есть такой запрос,который выбирает приходы,расходы и разницу во временном интервале:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT g.name, 
           g.goods_id, 
           coalesce(dt2.sum_income,0), 
           coalesce(dt2.sum_sales,0),
           coalesce(dt2.differ_between,0)
FROM goods g
LEFT JOIN
(SELECT goods_id,
            sum(sum_income) as sum_income,
            sum(sum_sale) as sum_sale,
            sum(sum_income - sum_sale) as differ_between
 from (select goods_id, sum(incomeqty) as sum_income, 0 as sum_sale, 'income' as which
      from income
      where income.recdate between :d1 and :d2         
      group by goods_id
    union all
      select goods_id, 0, sum(salesqty), 'sale'
      from sales
      where sale.recdate between :d1 and :d2 
      group by goods_id) dt1
 group by goods_id
) dt2 
on g.goods_id = dt2.goods_id



Но я хочу в нём добавить стартовые остатки.
стартовые остатки до интервала времены =sum(прыходы)-sum(расходы).
Конечные остатки в конце интервала времены=стартовые остатки+прыходы в интервале-расходы в интервале.
стартовые остатки по-моему должны получиться так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select income.goods_id, sum(incomeqty) as start_income, 0 as start_sale, 'income' as which
            from income
            where income.recdate < :d1
            group by goods_id
          union all
            select goods_id,0, sum(saleqty) as start_sale, 'sale'
            from sale
            where sale.recdate < :d1
            group by goods_id
         group by goods_id



Где и как включить в главном запросе запрос получения стартовых остатков?
...
Рейтинг: 0 / 0
23.04.2016, 04:26
    #39222964
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать запрос получения остатков склада
Delphi159Где и как включить в главном запросе запрос получения стартовых остатков?

ну как-то так

Код: 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.
SELECT dt1.goods_id,
            sum(dt1.sum_income_start) as sum_income_start,
            sum(dt1.sum_income) as sum_income,
            sum(dt1.sum_sale_start) as sum_sale_start,
            sum(dt1.sum_sale) as sum_sale,
            sum(dt1.sum_income - sum_sale) as differ_between
 from (
          select i.goods_id, 
             sum(case when  i.recdate < :d1 then i.incomeqty end) as sum_income_start,
             sum(case when  i.recdate between :d1 and :d2  then i.incomeqty end) as sum_income,
             0 as sum_sale_start,
             0 as sum_sale
          from income i
            where i.recdate <= :d2         

        union all

          select s.goods_id, 
            0,
            0,
            sum(case when  s.recdate < :d1 then s.salesqty end) as sum_sale_start,
            sum(case when  s.recdate between :d1 and :d2  then salesqty end) as sum_sale
         from sales s
           where s.recdate < :d2 
       ) dt1
 group by goods_id
...
Рейтинг: 0 / 0
24.04.2016, 03:33
    #39223267
Delphi159
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать запрос получения остатков склада
m7m Почему-то конечные остатки неправильно получаю(endqnt): 5000+1000-20-5=6000?

Derived Table DT1 и конечный запрос дают такой результат:
https://drive.google.com/open?id=0BzX341-bH8y5Qm1oWi1FcXF2NG8

Код: 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.
SELECT
    G.Name,
    G.Doods_id,
    coalesce(dt2.startqnt,0) as startqnt,      
    coalesce(dt2.income,0)as income, 
    coalesce(dt2.sales,0)as sales,
    coalesce(dt2.writeoff,0)as writeoff,
    coalesce(dt2.endqnt,0) as endqnt
FROM Goods G
LEFT JOIN
(select                                                                            --dt2
     Pr_k,
     sum(startincome) as startincome,                                                           --приходы до 
     sum(startsale) as startsale,                                                                    --продажи до
     sum(startwriteoff) as startwriteoff,                                                         --списывание до
     sum(income) as income,                                                                        --приходы в интервале  
     sum(sale) as sales,                                                                               --продажи в интервале 
     sum(writeoff) as writeoff,                                                                       --списывание в интервале 
     sum(startincome-startsale-startwriteoff) as startqnt,                                --остатки стартовые 
     sum(startincome-startsale-startwriteoff+income-sale-writeoff) as endqnt    --конечные остатки
from(                                                                       
     
   select  i.goods_id,
           sum(case when i.recdate<'01/01/2010' then i.incomeqty end) as startincome,
           0 as startsale,
           0 as startwriteoff,                         --списывание товара
           sum(case when i.recdate between '01/01/2010'  and '01/01/2020' then i.incomeqty end) as income,
           0 as sale,
           0 as writeoff,
           'income' as which
    from income i
    where i.recdate <='01/01/2020'
    group by goods_id

  union all

    select
           s.goods_id,
           0,
           sum(case when s.recdate<'01/01/2010' then s.saleqty end) as startsale,
           0,
           0,
           sum(case when s.recdate between '01/01/2010' and '01/01/2020' then s.saleqty end) as sale,
           0,
           'sale'
    from sale s
    where s.recdate <= '01/01/2020'
    group by goods_id
 
 union all

    select
           w. goods_id,
           0, 
           0,
           sum(case when w.writeoffDate<'01/01/2010' then w.writeoffQty end) as startwriteoff,
           0,
           0,
           sum(case when w.writeoffDate between '01/01/2010' and '01/01/2020' then w.writeoffQty end) as writeoff,
           'writeoff'
    from writeoff w
    where w.writeofDate < '01/01/2020'
    group by goods_id) dt1
 group by Goods_id )dt2
 on G.Goods_id=dt2.Goods_id                
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как написать запрос получения остатков склада / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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