powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / добавить столбец в запросе в Firebird
5 сообщений из 5, страница 1 из 1
добавить столбец в запросе в Firebird
    #39220536
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.
select income.goods_id,
       sum(case when which = 'income' then sum_amt else 0 end) as sum_income,
       sum(case when which = 'sale' then sum_amt else 0 end) as sum_sale,
      sum(case when which = 'income' then sum_amt else 0 end)
     - sum(case when which = 'sale' then sum_amt else 0 end) as differ_between
from (select goods_id, sum(incomeqty) as sum_amt, 'income' as which
          from income
         where income.recdate betwwen :d1 and :d2         
         group by pr_k
        union all
        select goods_id, sum(salesqty), 'sale'
          from sales
          where sale.recdate between :d1 and :d2 
         group by goods_id) x
group by goods_id



но не могу правильно добавить в запросе из goods таблицы столбец "name" и `if clause("where goods_id=income.goods_id").
...
Рейтинг: 0 / 0
добавить столбец в запросе в Firebird
    #39220560
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оборачивай этого монстра ещё раз в derived table и уже сверху джоинь свою goods.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
добавить столбец в запросе в Firebird
    #39221872
Delphi159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select goods.goods_id,dt2.goods_id,dt2.sum_income,dt2.sum_sales,dt2.differ_between
from goods
LEFT JOIN
(select goods_id,
   sum(case when which = 'income' then sum_amt else 0 end) as sum_income,
   sum(case when which = 'sale' then sum_amt else 0 end) as sum_sale,
  sum(case when which = 'income' then sum_amt else 0 end)
 - sum(case when which = 'sale' then sum_amt else 0 end) as differ_between
 from (select goods_id, sum(incomeqty) as sum_amt, 'income' as which
      from income
      where income.recdate between :d1 and :d2         
      group by goods_id
    union all
      select goods_id, sum(salesqty), 'sale'
      from sales
      where sale.recdate between :d1 and :d2 
      group by goods_id) dt1
 group by goods_id
)dt2
on goods.goods_id=dt2.goods_id



Правильно работает только тогда, если в интервале есть приход или/и расход, а если в интервале не прихода и не расхода, тогда поля Goods_id,sum_income, sum_sale, differ_between пустые, только название товара в строке. А я хочу, чтобы список товара всегда существовал.
...
Рейтинг: 0 / 0
добавить столбец в запросе в Firebird
    #39222026
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi159А я хочу, чтобы список товара всегда существовал.
https://www.ibase.ru/joins/
...
Рейтинг: 0 / 0
добавить столбец в запросе в Firebird
    #39222420
Delphi159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исправил. Вместо g.goods_id в select писал dt2.goods_id.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select goods.goods_id,goods.goods_id,dt2.sum_income,dt2.sum_sales,dt2.differ_between
from goods
LEFT JOIN
(select goods_id,
   sum(case when which = 'income' then sum_amt else 0 end) as sum_income,
   sum(case when which = 'sale' then sum_amt else 0 end) as sum_sale,
  sum(case when which = 'income' then sum_amt else 0 end)
 - sum(case when which = 'sale' then sum_amt else 0 end) as differ_between
 from (select goods_id, sum(incomeqty) as sum_amt, 'income' as which
      from income
      where income.recdate between :d1 and :d2         
      group by goods_id
    union all
      select goods_id, sum(salesqty), 'sale'
      from sales
      where sale.recdate between :d1 and :d2 
      group by goods_id) dt1
 group by goods_id
)dt2
on goods.goods_id=dt2.goods_id
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / добавить столбец в запросе в Firebird
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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