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

Откуда: Москва
Сообщений: 598
Есть таблица
SET NOCOUNT ON
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO


IF OBJECT_ID('[TestDoc].[A]') IS NOT NULL
  DROP TABLE [TestDoc].[A]


IF SCHEMA_ID('TestDoc') IS NULL
  EXEC('
    CREATE SCHEMA [TestDoc]
  ')
GO

IF OBJECT_ID('[TestDoc].[A]') IS NULL
  
CREATE TABLE [TestDoc].[A]
  (
    [code]        Int           NOT NULL  IDENTITY(1,1),
    [identifier] nvarchar(50)    not null,
    [docid]     int not   NULL,
	[motion] int not null,
    [globalID]  int not      NULL,  
    [Date]    smalldatetime          NOT NULL,
   PRIMARY KEY CLUSTERED([code])
  )
GO

INSERT INTO [TestDoc].[A]

SELECT 'F1',1,-1,123,'2018-03-01'
UNION
SELECT 'F1',1,1,150,'2018-03-01'
UNION
SELECT 'F1',2,-1,150,'2018-03-03'
UNION
SELECT 'F1',2,1,160,'2018-03-03'
UNION
SELECT 'F1',3,-1,190,'2018-03-05'
UNION
SELECT 'F1',3,1,200,'2018-03-05'
UNION
SELECT 'F1',4,-1,160,'2018-03-05'
UNION
SELECT 'F1',4,1,190,'2018-03-05'
UNION
SELECT 'F2',5,-1,123,'2018-03-01'
UNION
SELECT 'F2',5,1,150,'2018-03-01'
UNION
SELECT 'F2',6,-1,150,'2018-03-03'
UNION
SELECT 'F2',6,1,160,'2018-03-03'
UNION
SELECT 'F2',7,-1,190,'2018-03-05'
UNION
SELECT 'F2',7,1,200,'2018-03-05'
UNION
SELECT 'F2',8,-1,160,'2018-03-04'
UNION
SELECT 'F2',8,1,190,'2018-03-04'


Хочу выстроить правильную иерархию в данных
и получить таблицу вида, т.е. алгоритм такой, Motion - Это расход приход(-1 - расход, 1 - приход), GlobalID- Айд склада. Т.е. куда пришел, оттуда и вышел. Если дата одинаковая, то надо смотреть по globalID.

codeidentifierdocidmotionglobalIDDate
1 F1 1 -1 123 2018-03-01 00:00:00
2 F1 1 1 150 2018-03-01 00:00:00
3 F1 2 -1 150 2018-03-03 00:00:00
4 F1 2 1 160 2018-03-03 00:00:00
7 F1 4 -1 160 2018-03-05 00:00:00
8 F1 4 1 190 2018-03-05 00:00:00
5 F1 3 -1 190 2018-03-05 00:00:00
6 F1 3 1 200 2018-03-05 00:00:00
9 F2 5 -1 123 2018-03-01 00:00:00
10 F2 5 1 150 2018-03-01 00:00:00
11 F2 6 -1 150 2018-03-03 00:00:00
12 F2 6 1 160 2018-03-03 00:00:00
15 F2 8 -1 160 2018-03-04 00:00:00
16 F2 8 1 190 2018-03-04 00:00:00
13 F2 7 -1 190 2018-03-05 00:00:00
14 F2 7 1 200 2018-03-05 00:00:00


Ну и в итоге получить две строчки, где нах-ся identifier на данный момент времени

codeidentifierdocidmotionglobalIDDate
6 F1 3 1 200 2018-03-05 00:00:00
2 F2 7 1 200 2018-03-05 00:00:00
27 мар 18, 11:25    [21289185]     Ответить | Цитировать Сообщить модератору
 Re: Как упорядочить данные в таблице?  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
minya13_85,

Посчитай сумму motion по identifier и globalID. Где будет отличная от 0 - там и остаток.
Ну или бери последнее движение по твоим условиям:

Select top 1 with ties *
From [TestDoc].[A]
Where [Date]<@НужнаяДата
Order by Row_Number() over (Partition by [identifier] Order by [Date] desc, globalID)
27 мар 18, 11:56    [21289309]     Ответить | Цитировать Сообщить модератору
 Re: Как упорядочить данные в таблице?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Такая конструкция не сработает, т.к. дата может быть одинаковая, данный пример в частности не сработает.

Kopelly
minya13_85,

Посчитай сумму motion по identifier и globalID. Где будет отличная от 0 - там и остаток.
Ну или бери последнее движение по твоим условиям:

Select top 1 with ties *
From [TestDoc].[A]
Where [Date]<@НужнаяДата
Order by Row_Number() over (Partition by [identifier] Order by [Date] desc, globalID)



Такая конструкция тоже не сработает, мне нужно знать именно последнюю строку в этой иерархии, т.к. эта таблица тестовая, некоторых значений тут не отображено. Допустим нужно вывести еще поле CODE

Select identifier,globalID
From [TestDoc].[A]
group by identifier,globalID
having sum(motion)=1


Для усложнения допишем еще данных в таблицу
INSERT INTO [TestDoc].[A]

SELECT 'F2',9,-1,200,'2018-03-05'
UNION
SELECT 'F2',9,1,200,'2018-03-05'


Т.е. в этой таблице товар может перемещаться в рамках одного склада. Тогда мы получим просто F2 находится на 200 складе, а какой CODE соответствует этой записи неизвестно.
27 мар 18, 13:22    [21289713]     Ответить | Цитировать Сообщить модератору
 Re: Как упорядочить данные в таблице?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Ни у кого мыслей нет?
28 мар 18, 11:54    [21292696]     Ответить | Цитировать Сообщить модератору
 Re: Как упорядочить данные в таблице?  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
minya13_85
Ни у кого мыслей нет?

мысль одна - для учёта товаров и его движения есть две с половиной модели данных, для которых разработаны алгоритмы на все случаи жизни. таки перейдите на них и не изобретайте велосипед ))
пысы -"два с половиной", на самом деле два, а половика - это вариации между ними.
28 мар 18, 12:10    [21292759]     Ответить | Цитировать Сообщить модератору
 Re: Как упорядочить данные в таблице?  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
minya13_85,

Select top 1 with ties *
From [TestDoc].[A]
Where [Date]<@НужнаяДата
Order by Row_Number() over (Partition by [identifier] Order by [Date] desc, globalID desc)

Определяет последние движения идентификатора. Если на последнюю дате есть несколько движений, то смотрит на globalID (выражение "Order by [Date] desc,globalID desc").
28 мар 18, 13:14    [21292973]     Ответить | Цитировать Сообщить модератору
 Re: Как упорядочить данные в таблице?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Kopelly
minya13_85,

Select top 1 with ties *
From [TestDoc].[A]
Where [Date]<@НужнаяДата
Order by Row_Number() over (Partition by [identifier] Order by [Date] desc, globalID desc)

Определяет последние движения идентификатора. Если на последнюю дате есть несколько движений, то смотрит на globalID (выражение "Order by [Date] desc,globalID desc").


GlobalID не обязательно будет максимальным. Тут пример немного не удачный)) GlobalID - это просто набор цифр, ID, он может быть как максимальным, так и минимальным
28 мар 18, 14:11    [21293197]     Ответить | Цитировать Сообщить модератору
 Re: Как упорядочить данные в таблице?  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2394
minya13_85
GlobalID не обязательно будет максимальным. Тут пример немного не удачный)) GlobalID - это просто набор цифр, ID, он может быть как максимальным, так и минимальным


вы действительно хотите узнать на форуме, что делать если не хватает данных в системе?
да, если в дате обрезано время, а нужно узнать движуху на день - то использование ID это уже лукавство (попытка хоть как-то определиться).
если и его нельзя использовать, значит все. тушите свет. детализация движения - до дня
29 мар 18, 12:18    [21295705]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить