powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как упорядочить данные в таблице?
8 сообщений из 8, страница 1 из 1
Как упорядочить данные в таблице?
    #39621012
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
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.

codeidentifierdocidmotionglobalIDDate1 F1 1 -1 123 2018-03-01 00:00:002 F1 1 1 150 2018-03-01 00:00:003 F1 2 -1 150 2018-03-03 00:00:004 F1 2 1 160 2018-03-03 00:00:007 F1 4 -1 160 2018-03-05 00:00:008 F1 4 1 190 2018-03-05 00:00:005 F1 3 -1 190 2018-03-05 00:00:006 F1 3 1 200 2018-03-05 00:00:009 F2 5 -1 123 2018-03-01 00:00:0010 F2 5 1 150 2018-03-01 00:00:0011 F2 6 -1 150 2018-03-03 00:00:0012 F2 6 1 160 2018-03-03 00:00:0015 F2 8 -1 160 2018-03-04 00:00:0016 F2 8 1 190 2018-03-04 00:00:0013 F2 7 -1 190 2018-03-05 00:00:0014 F2 7 1 200 2018-03-05 00:00:00

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

codeidentifierdocidmotionglobalIDDate6 F1 3 1 200 2018-03-05 00:00:002 F2 7 1 200 2018-03-05 00:00:00
...
Рейтинг: 0 / 0
Как упорядочить данные в таблице?
    #39621045
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minya13_85,

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

Код: sql
1.
2.
3.
4.
Select top 1 with ties *
From [TestDoc].[A]
Where [Date]<@НужнаяДата
Order by Row_Number() over (Partition by [identifier] Order by [Date] desc, globalID)
...
Рейтинг: 0 / 0
Как упорядочить данные в таблице?
    #39621146
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая конструкция не сработает, т.к. дата может быть одинаковая, данный пример в частности не сработает.

Kopellyminya13_85,

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

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




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

Код: sql
1.
2.
3.
4.
Select identifier,globalID
From [TestDoc].[A]
group by identifier,globalID
having sum(motion)=1



Для усложнения допишем еще данных в таблицу
Код: sql
1.
2.
3.
4.
5.
INSERT INTO [TestDoc].[A]

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



Т.е. в этой таблице товар может перемещаться в рамках одного склада. Тогда мы получим просто F2 находится на 200 складе, а какой CODE соответствует этой записи неизвестно.
...
Рейтинг: 0 / 0
Как упорядочить данные в таблице?
    #39621905
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни у кого мыслей нет?
...
Рейтинг: 0 / 0
Как упорядочить данные в таблице?
    #39621915
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minya13_85Ни у кого мыслей нет?
мысль одна - для учёта товаров и его движения есть две с половиной модели данных, для которых разработаны алгоритмы на все случаи жизни. таки перейдите на них и не изобретайте велосипед ))
пысы -"два с половиной", на самом деле два, а половика - это вариации между ними.
...
Рейтинг: 0 / 0
Как упорядочить данные в таблице?
    #39621972
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minya13_85,

Код: sql
1.
2.
3.
4.
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").
...
Рейтинг: 0 / 0
Как упорядочить данные в таблице?
    #39622036
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopellyminya13_85,

Код: sql
1.
2.
3.
4.
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, он может быть как максимальным, так и минимальным
...
Рейтинг: 0 / 0
Как упорядочить данные в таблице?
    #39622593
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minya13_85GlobalID не обязательно будет максимальным. Тут пример немного не удачный)) GlobalID - это просто набор цифр, ID, он может быть как максимальным, так и минимальным

вы действительно хотите узнать на форуме, что делать если не хватает данных в системе?
да, если в дате обрезано время, а нужно узнать движуху на день - то использование ID это уже лукавство (попытка хоть как-то определиться).
если и его нельзя использовать, значит все. тушите свет. детализация движения - до дня
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как упорядочить данные в таблице?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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