Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Хитрый запрос.  [new]
Ross-a
Member

Откуда:
Сообщений: 2
Приветствую All.
Помогите с запросом:
Задача

Есть база с фактурами типа Baza
ДатаСумма Р
01/01/01;100
01/01/01;200
02/01/01;100
03/01/01;100

И база с оплатами Opl
Дата;Сумма О

01/01/01;100
04/01/01;100
07/01/01;100



даты в базах могут и не совпадать.
Нужно получить

Дата; Сумма Р;Сумма О; Сальдо
01/01/01;300;100;-200
02/01/01;100;0;-300
03/01/01;100;0;-400
04/01/01;0;100;-300
07/01/01;0;100;-200

Как это сделать выборкой и передобор это понятно :)
А единым запросом это сделать можно ?
16 ноя 09, 04:19    [7931676]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос.  [new]
Добрый Э - Эх
Guest
Ross-a
Как это сделать выборкой и передобор это понятно :)
А единым запросом это сделать можно ?
Можно и единым запросом:
with
--
-- Тестовые данные таблицы baza:
  baza ([Дата], [Сумма Р]) as
    (
      select '01/01/01', 100 union all
      select '01/01/01', 200 union all
      select '02/01/01', 100 union all
      select '03/01/01', 100
    ),
--
-- Тестовые данные таблицы opl:
  opl ([Дата], [Сумма О]) as
    (
      select '01/01/01', 100 union all
      select '04/01/01', 100 union all
      select '07/01/01',  60 union all
      select '07/01/01',  40
    )
--
-- Основной запрос:
select coalesce(v_baza.[Дата], v_opl.[Дата]) as [Дата],
       isnull(v_baza.[Сумма Р],0) as [Сумма Р],
       isnull(v_opl.[Сумма О],0) as [Сумма О],
       (
         select sum([Сумма О])
           from opl
          where opl.[Дата] <= coalesce(v_baza.[Дата], v_opl.[Дата])
       ) -
       (
         select sum([Сумма Р])
           from baza
          where baza.[Дата] <= coalesce(v_baza.[Дата], v_opl.[Дата])
       ) as [Сальдо]
  from (
         select [Дата], sum([Сумма Р]) as [Сумма Р]
           from baza
          group by [Дата]
       ) as v_baza
  full outer join 
       (
         select [Дата], sum([Сумма О]) as [Сумма О]
           from opl
          group by [Дата]
       ) as v_opl
    on v_baza.[Дата] = v_opl.[Дата]
 order by coalesce(v_baza.[Дата], v_opl.[Дата]);
ДатаСумма РСумма ОСальдо
01/01/01300100-200
02/01/011000-300
03/01/011000-400
04/01/010100-300
07/01/010100-200

Но остается открытым вопрос: насколько такое решение будет эффективным?
16 ноя 09, 06:29    [7931711]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос.  [new]
Ross-a
Member

Откуда:
Сообщений: 2
Ну да ...
В принципе надо найти последнию неоплаченную фактуру ( если оно есть) и долг на тек дату
Ну и продую без доп. таблицы с содержанием фактура-оплата. Данная схема сейчас работает, хочу от нее уйти, т.е. отвязать фактуры от оплат, но нужна просрочка оплаты
16 ноя 09, 09:17    [7931840]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить