Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Аллокация без цикла и без курсора / 13 сообщений из 13, страница 1 из 1
28.11.2017, 18:42:30
    #39560798
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
Рискну задать чайниковый вопрос.

Есть 2 таблицы:

Таблица1:
OrdNoDatePartNameOrdQtyЗаказ101/02/18Part15Заказ201/01/18Part18Заказ301/05/18Part13

Таблица2:
PartNameBalancePart120Part229

Надо выдать OrdNo, Date, PartName, OrdQty, Balance с распределением остатков по заказам с сортировкой по дате.

Требуемый результат выборки:
OrdNoDatePartNameOrdQtyBalanceЗаказ201/01/18Part1820Заказ101/02/18Part1512Заказ301/05/18Part137

Как такое сделать без цикла и без курсора?
Заранее спасибо.
...
Рейтинг: 0 / 0
28.11.2017, 18:48:49
    #39560806
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
slovnet,

У вас баланс не сходится
...
Рейтинг: 0 / 0
28.11.2017, 18:51:03
    #39560808
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
Почему?
После поставки заказов 2 и 1 остаётся 7.
...
Рейтинг: 0 / 0
28.11.2017, 19:00:53
    #39560814
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
slovnet
Надо выдать OrdNo, Date, PartName, OrdQty, Balance с распределением остатков по заказам с сортировкой по дате.

Переформулирую, коллега - "Надо выдать OrdNo, Date, PartName, OrdQty, Balance с распределением остатков на начало исполнения заказа по заказам с сортировкой по дате. Цель - проверить, не было ли кривых документов отгрузки по заказу уже схлопнутого в ноль остатка".
По факту - реализуется оконной функцией T-SQL. Думаю, коллеги сейчас ссылок накидают.
...
Рейтинг: 0 / 0
28.11.2017, 19:11:28
    #39560819
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
Andy_OLAP,

Ну, конкретная бизнес-задача несколько иная.
Это для отдела планирования. Им надо глянуть есть ли достаточно готовой продукции на складе, сколько пустить в производство.

Но мне бы синтаксис. T-SQL не моя область.
...
Рейтинг: 0 / 0
28.11.2017, 19:19:46
    #39560824
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
Нарастающий итог.
Чистая теория. Можно рукалицеить.

2012+:
Код: sql
1.
[qty] = SUM( ... ) OVER ( PARTITION BY [PartName] ROWS BETWEEN UNBOUNDED PRECEDING AND [CURRENT ROW|1 PRECEDING ROW] )



2008-:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WITH 
t AS (
  SELECT
     *,
     [rn] = ROW_NUMBER() OVER ( PARTITION BY [PartName] ORDER BY [date|ord_no] DESC )
)
SELECT
  *
FROM
  t t1
  OUTER APPLY (
     SELECT
       [qty] = SUM( ... )
     FROM
        t t2
     WHERE
       t2.[PartName] = t1.[PartName]
       AND t2.[rn] <= t1.[rn]
  ) ss
...
Рейтинг: 0 / 0
28.11.2017, 19:24:32
    #39560825
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
Руслан Дамирович,

Спасибо! будем играться.
...
Рейтинг: 0 / 0
28.11.2017, 19:53:33
    #39560838
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
В последнем варианте накосячил - или ORDER BY .... (без DESC) или t2.[rn] > t1.[rn]
...
Рейтинг: 0 / 0
28.11.2017, 20:04:06
    #39560847
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
Спасибо
...
Рейтинг: 0 / 0
28.11.2017, 21:50:29
    #39560886
andrey odegov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with
  [Таблица1] as(
    select OrdNo,cast([Date] as date) [Date],PartName,OrdQty
    from(
      values(N'Заказ1','2018-02-01','Part1',5),
            (N'Заказ2','2018-01-01','Part1',8),
            (N'Заказ3','2018-03-01','Part1',3)
    )t(OrdNo,[Date],PartName,OrdQty)
  ),
  [Таблица2] as(
    select *
    from(
      values('Part1',20),('Part2',29)
    )t(PartName,Balance)
  )
select t1.OrdNo,t1.[Date],t1.PartName,t1.OrdQty,
  t2.Balance+t1.OrdQty-
  sum(t1.OrdQty)
    over(partition by t1.PartName
         order by t1.[Date]
         rows unbounded preceding) Balance
from [Таблица1] t1 join [Таблица2 ]t2
  on t1.PartName=t2.PartName
...
Рейтинг: 0 / 0
28.11.2017, 22:37:01
    #39560909
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
andrey odegov,

Спасибо
...
Рейтинг: 0 / 0
30.11.2017, 19:14:49
    #39562190
slovnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
Руслан Дамирович,

Разобрался. Попутно много понял.
Огромное спасибо.
...
Рейтинг: 0 / 0
04.12.2017, 16:18:53
    #39563867
Goga-Gola
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация без цикла и без курсора
slovnet,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    DECLARE @Orders TABLE (OrdNo VARCHAR(20), [Date] Date, PartName VARCHAR(20), OrdQty INT);
    DECLARE @Balance TABLE (PartName VARCHAR(20), Balance INT);

    INSERT @Orders VALUES
        ('Заказ1', '1.2.18', 'Part1', 5),
        ('Заказ2', '1.1.18', 'Part1', 8),
        ('Заказ3', '1.5.18', 'Part1', 3);

    INSERT @Balance VALUES
        ('Part1', 20),
        ('Part2', 29);

    SELECT OrdNo, 
           [Date],
           Orders.PartName,
           OrdQty,
           Balance - IsNull(SUM(OrdQty) OVER (PARTITION BY Orders.PartName  ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING),0) AS Total31
      FROM @Orders AS Orders
INNER JOIN @Balance as Balance ON Orders.PartName = Balance.PartName
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Аллокация без цикла и без курсора / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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