ПОДПИСЬ С ОДНЫМ СТОЛОМ - PullRequest
0 голосов
/ 15 января 2019

У меня есть таблица, которая содержит:

  • ID_Magasin: 001 для склада, c01 для magasin1, c02 для magasin 2, ..
  • Qte_Physique: количество товара
  • id_article: код статьи
  • lib_article: обозначение статьи

Сначала я хочу запрос, приведите все количество статей для каждого magasin. во-вторых, в том же запросе я хочу добавить новый столбец для отображения количества той же статьи в хранилище данных.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Ваш подзапрос не связан с основным запросом. То есть не хватает условия, на какой товар смотреть.

select
  gq_depot,
  gq_article,
  gq_physique,
  (
    select warehouse.gq_physique
    from dispo warehouse
    where warehouse.gq_depot = '001'
    and warehouse.gq_article = magasin.gq_article
  ) as wh_physique
from dispo magasin
where gq_depot <> '001'
order by gq_depot, gq_article;

Вы можете сделать то же самое с объединением:

select
  magasin.gq_depot,
  magasin.gq_article,
  magasin.gq_physique,
  warehouse.gq_physique as wh_physique
from dispo magasin
left join dispo warehouse on  warehouse.gq_article = magasin.gq_article
                          and warehouse.gq_depot = '001'
where magasin.gq_depot <> '001'
order by magasin.gq_depot, magasin.gq_article;

Для удобства чтения вы можете использовать предложения WITH, если они есть в вашей СУБД:

with warehouse as (select * from dispo where gq_depot = '001')
   , magasin as (select * from dispo where gq_depot <> '001')
select
  magasin.gq_depot,
  magasin.gq_article,
  magasin.gq_physique,
  warehouse.gq_physique as wh_physique
from magasin
left join warehouse on warehouse.gq_article = magasin.gq_article
order by magasin.gq_depot, magasin.gq_article;

Вышеуказанные запросы работают только правильно, если gq_depot + gq_article уникальны в таблице (например, составляют первичный ключ). В противном случае вам понадобится агрегация, чтобы получить всего gq_physique за gq_depot + gq_article.

0 голосов
/ 15 января 2019

Если я правильно понимаю, вы можете сделать это с помощью оконной функции:

select d.*
from (select d.*, 
            sum(case when id_magasin = '001' then Qte_Physique else 0 end) over (partition by id_article) as wharehouse_qte
     from dispo d
    ) d
where id_magasin <> '001';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...