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

Откуда:
Сообщений: 16
Здравствуйте, не могу не как выбрать последнюю запись по дате. Пример
существует таблица с полями : ДАТА, Код товара,количество,Клиент,Торговый агент,Месяц.Пытаюсь получить последние значение за последнюю дату таким запросом

select max(Дата),количество,[Торговый агент],[Клиент],[Код товара ]
from [TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat],[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu]
where Месяц='05_Май'and[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu].Chek=[TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat].Chek
and [Торговый агент ]='MC11' (в нес условия чтоб легче просматривать было результат)
and [Клиент]='A0022'(в нес условия чтоб легче просматривать было результат)
group by количество,[Торговый агент],[Клиент],[Код товара ]
order by max(Дата),[Торговый агент ],[Код товара],[Клиент] ,[количество] DESC

Результат:

ДАТА кол-во Торговый агент Клиент Код товара
4016-05-17 16:45:59.000 1 MC11 A0022 M41011
4016-05-17 16:45:27.000 2 MC11 A0022 MS19014
4016-05-17 16:44:02.000 1 MC11 A0022 M14090
4016-05-17 16:42:22.000 0 MC11 A0022 M06072
4016-05-17 16:47:28.000 0 MC11 A0022 Z01078
4016-05-24 11:10:05.000 1 MC11 A0022 MS07003
4016-05-24 11:10:36.000 2 MC11 A0022 M06091
4016-05-24 11:11:19.000 1 MC11 A0022 MS14033
4016-05-31 14:46:16.000 0 MC11 A0022 MS19014
4016-05-31 14:46:16.000 0 MC11 A0022 MS07001
4016-05-31 14:46:16.000 0 MC11 A0022 MS07003
4016-05-31 14:46:16.000 0 MC11 A0022 M06091
4016-05-31 14:46:16.000 0 MC11 A0022 MS14033
4016-05-31 14:46:16.000 0 MC11 A0022 MS06028
4016-05-31 14:46:16.000 0 MC11 A0022 M06073


Ожидаемый результат

ДАТА кол-во Торговый агент Клиент Код товара
4016-05-17 16:45:59.000 1 MC11 A0022 M41011
4016-05-17 16:44:02.000 1 MC11 A0022 M14090
4016-05-17 16:42:22.000 0 MC11 A0022 M06072
4016-05-17 16:47:28.000 0 MC11 A0022 Z01078
4016-05-24 11:10:36.000 2 MC11 A0022 M06091
4016-05-31 14:46:16.000 0 MC11 A0022 MS19014
4016-05-31 14:46:16.000 0 MC11 A0022 MS07001
4016-05-31 14:46:16.000 0 MC11 A0022 MS07003
4016-05-31 14:46:16.000 0 MC11 A0022 M06091
4016-05-31 14:46:16.000 0 MC11 A0022 MS14033
4016-05-31 14:46:16.000 0 MC11 A0022 MS06028
4016-05-31 14:46:16.000 0 MC11 A0022 M06073

То и есть результат ожидаемый что по последней дате добавления выводиться количество в разрезе клиента, торгового агента, товара

Помогите пожалуйста разобраться.
1 июн 16, 07:14    [19243785]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
aleks2
Guest
Прочти про row_number() over() и примени.

ЗЫ. Хотя раньше коррелированным подзапросом обходились.

select Дата, количество,[Торговый агент],[Клиент],[Код товара ]
from [TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat],[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu]
where Месяц='05_Май'and[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu].Chek=[TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat].Chek 
and [Торговый агент ]='MC11' (в нес условия чтоб легче просматривать было результат)
and [Клиент]='A0022'(в нес условия чтоб легче просматривать было результат)

and Дата = ( select max(Дата) from [хрен тут поймешь, в какой табле у тя дата] as t where  t.[Торговый агент] = [Торговый агент] and t.[Клиент] = [Клиент] and t.[Код товара ] = [Код товара ] )
1 июн 16, 07:53    [19243816]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
Добрый Э - Эх
Guest
Staxs,

Читать тут
1 июн 16, 07:56    [19243821]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
Staxs
Member

Откуда:
Сообщений: 16
Добрый Э - Эх,

При использований кодов указных по ссылке. Результатом является последняя запись по клиенту с последним товаром. А нужен результат по дате в разрезе товара,клиента и торгового агента к примеру:

дата                    Количество     Клиент      Торговый агент  Код товара
03-15-2016 08:01:17.000 6 As01 NV3 A002
03-15-2016 07:15:23.000 2 As01 NV1 A003
03-15-2016 09:10:51.000 1 As01 NV1 A004
03-15-2016 12:11:45.000 3 As01 NV1 A005
03-20-2016 09:08:01.000 6 As01 NV1 A004
03-20-2016 10:15:13.000 6 As02 NV1 A010
03-20-2016 11:10:36.000 6 As01 NV1 A005
запрос
select top 1 with ties *
from [Таблица]
order by row_number()
over(partition by [Клиент]
order by [Дата] desc)

вернет значение
дата                             Количество     Клиент      Торговый агент  Код товара
03-20-2016 11:10:36.000 6 As01 NV1 A005

а желаемый результат
дата                             Количество     Клиент      Торговый агент  Код товара
03-15-2016 08:01:17.000 6 As01 NV3 A002
03-15-2016 07:15:23.000 2 As01 NV1 A003
03-20-2016 09:08:01.000 6 As01 NV1 A004
03-20-2016 10:15:13.000 6 As02 NV1 A010
03-20-2016 11:10:36.000 6 As01 NV1 A005

Взято по торговому агенту NV3 последние значение,по клиенту As02 и торговому агенту NV1 . А для As01 по торговому агенту NV1 выведены значения по последней записи добавления каждого товара.
То и есть взятие последнего значения по полю количество на последнюю дату добавления записи в разрезе Код товара,Торговый агент , Клиент . И вот это ни как не получается сделать.
1 июн 16, 08:42    [19243899]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
Добрый Э - Эх
Guest
Staxs,

что указал в секции PARTITION, в разрезе того и получил максимум даты.
не скупись добавлять нужные поля для получения требуемого среза...
1 июн 16, 08:51    [19243915]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
Staxs
Member

Откуда:
Сообщений: 16
Добрый Э - Эх,

От игры со столбцами PARTITION результат не меняется( какие бы поля я добавлял результат не меняется).

0 MCV11 A0022 M06091 4016-05-31 14:46:16.000
2 MCV11 A0022 M06091 4016-05-24 11:10:36.000
2 MCV11 A0022 M06091 4016-05-17 16:41:54.000

А вот если прописать

select top 1 Количество
,[Код Торгового агента]
,[Код контрагента]
,[_Fld7416]
,Дата
from [TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat],[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu]

where Месяц='05_Май'and[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu].Chek=[TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat].Chek and [Код Торгового агента]='MCv11'
and [Код контрагента]='A0022' and _Fld7416='M06091'

order by row_number()
over(partition by [Код Торгового агента]
order by Дата desc)
верный результат
0 MCv11 A0022 M06091 4016-05-31 14:46:16.000
но так как в базе более 1000 клиентов и так же с товаром для каждого отдельно прописывать не вариант(((
1 июн 16, 09:19    [19244024]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
Добрый Э - Эх
Guest
Staxs,

ещё одна подсказка: PARTITION в аналитических функциях - это как бы аналог GROUP BY при группировки -в кляузе PARTITOIN через запятую можно указывать более одного столбца...
соответственно, если требуется вывести что-то в разрезе пользователя, товарного агента и товара, то все поля, определяющие эти сущности, должны быть указаны в секции PARTITION.
1 июн 16, 09:38    [19244093]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
Staxs
Member

Откуда:
Сообщений: 16
Добрый Э - Эх,

я это понял, только результат не изменен.
select _Fld7425
,[Код Торгового агента]
,[Код контрагента]
,[Код товара]
,Дата
from [TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat],[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu]

where Месяц='05_Май'and[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu].Chek=[TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat].Chek and [Код Торгового агента]='MCv11'
and [Код контрагента]='A0022' and [Код товара]='M06091'


order by row_number()
over(partition by [Код контрагента],[Код Торгового агента],[_Fld7416],[Код товара]
order by Дата desc )

0 MCV11 A0022 M06091 4016-05-31 14:46:16.000
2 MCV11 A0022 M06091 4016-05-24 11:10:36.000
2 MCV11 A0022 M06091 4016-05-17 16:41:54.000
1 июн 16, 09:59    [19244188]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
Добрый Э - Эх
Guest
Staxs,

предоставь юзабильный репрезентативный набор тестовых данных, желаемый вид результата на них, свой вариант запроса по этим тестовым данным и описание того, чем полученный результат твоего запроса не соответствует твоим же ожиданиям.

Потому как читать портянки кода с разным именованием одних и тех же сущностей в разных постах - вряд ли кто-то захочет.
Ведь сам посмотри - в первом посту ты пишешь [Торговый агент ],[Код товара],[Клиент]. В последующих уже о каких-то [Код контрагента],[Код Торгового агента],[_Fld7416] речь идет. Сам запутался в показаниях и нас путаешь...
1 июн 16, 10:24    [19244320]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
aleks2
Guest
Staxs
Добрый Э - Эх,

я это понял, только результат не изменен.
select _Fld7425
,[Код Торгового агента]
,[Код контрагента]
,[Код товара]
,Дата
from [TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat],[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu]

where Месяц='05_Май'and[TRZBASEAGENT].[dbo].[MTPStimul_tovar_izmereniu].Chek=[TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat].Chek and [Код Торгового агента]='MCv11'
and [Код контрагента]='A0022' and [Код товара]='M06091'


order by row_number()
over(partition by [Код контрагента],[Код Торгового агента],[_Fld7416],[Код товара]
order by Дата desc )

0 MCV11 A0022 M06091 4016-05-31 14:46:16.000
2 MCV11 A0022 M06091 4016-05-24 11:10:36.000
2 MCV11 A0022 M06091 4016-05-17 16:41:54.000


Страдалец, научись пользоваться тэгами кода и сгененерируй исходные данные в таблицу.
Никому неохота ломать глаза и мозолить пальцы ради примитивной задачки.
1 июн 16, 10:26    [19244327]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
Staxs
Member

Откуда:
Сообщений: 16
Добрый Э - Эх,

Существует таблицa MTPStimul_tovar_datitogi
С полями [_Fld7425]---количество
,[_Fld7414]---Дата
,[_Fld7416]---код товара
,[Месяц]
,[Код Торгового агента]
,[Код контрагента]


[_Fld7425] [_Fld7414] [_Fld7416] [Месяц] [Код Торгового агента] [Код контрагента]
0 4016-05-17 16:47:28.000 Z01078 05_Май MCV11 A0022
1 4016-05-30 15:08:33.000 MS07001 05_Май MCV11 A0045
0 4016-05-30 15:07:32.000 MS07003 05_Май MCV11 A0045
1 4016-05-30 15:09:16.000 MS14031 05_Май MCV11 A0045
1 4016-05-30 15:09:22.000 MS14033 05_Май MCV11 A0045
1 4016-05-30 15:09:55.000 MS17006 05_Май MCV11 A0045
1 4016-05-30 15:10:02.000 MS17009 05_Май MCV11 A0045
0 4016-05-30 15:06:45.000 MS19014 05_Май MCV11 A0045
0 4016-05-27 15:02:28.000 MS19009 05_Май MCV08 A0055
0 4016-05-23 15:53:50.000 M06064 05_Май MCV12 A0062
0 4016-05-23 15:56:21.000 MS06031 05_Май MCV12 A0062
0 4016-05-23 15:56:40.000 MS06032 05_Май MCV12 A0062
0 4016-05-23 16:01:14.000 Z01078 05_Май MCV12 A0062
0 4016-05-24 10:58:03.000 MS11016 05_Май MCC06 A0074
0 4016-05-25 17:00:10.000 MS19009 05_Май MCV08 A0074
0 4016-05-25 16:59:43.000 MS19014 05_Май MCV08 A0074
0 4016-05-26 15:33:25.000 MS10007 05_Май MCC09 A0075
0 4016-05-27 14:17:06.000 MS43002 05_Май MCC09 A0075
0 4016-05-04 17:48:26.000 M17008 05_Май MCV11 A0075
1 4016-05-04 17:42:06.000 M40017 05_Май MCV11 A0075
2 4016-05-04 17:41:33.000 MS03022 05_Май MCV11 A0075
3 4016-05-04 17:43:08.000 MS06026 05_Май MCV11 A0075
1 4016-05-04 17:43:31.000 MS06027 05_Май MCV11 A0075
2 4016-05-04 17:43:15.000 MS06030 05_Май MCV11 A0075
2 4016-05-04 17:43:51.000 MS06031 05_Май MCV11 A0075
2 4016-05-04 17:44:10.000 MS06034 05_Май MCV11 A0075
2 4016-05-17 16:41:54.000 M06091 05_Май MCV11 A0022
2 4016-05-24 11:10:36.000 M06091 05_Май MCV11 A0022
0 4016-05-31 14:46:16.000 M06091 05_Май MCV11 A0022

выбрать операции за последнию дату месяца [_Fld7414] в разрезе [_Fld7425],[_Fld7416],[Месяц],[Код Торгового агента] ,
[Код контрагента].
Запрос:
select _Fld7425,_Fld7414,[_Fld7416], Месяц,[Код Торгового агента],[Код контрагента]
from [TRZBASEAGENT].[dbo].[MTPStimul_tovar_dat]
where Месяц='05_Май'
and _Fld7416='M06091'-------------------(добавил выборку для более читаемого результата)
and [Код контрагента]='A0075'----------(добавил выборку для более читаемого результата)
amd [Код Торгового агента]='MCV11'---(добавил выборку для более читаемого результата)
order by row_number()
over(partition by [Код контрагента],[Код Торгового агента],[_Fld7416]
order by _Fld7414 desc )
Результат


[_Fld7425] [_Fld7414] [_Fld7416] [Месяц] [Код Торгового агента] [Код контрагента]
2 4016-05-17 16:41:54.000 M06091 05_Май MCV11 A0022
2 4016-05-24 11:10:36.000 M06091 05_Май MCV11 A0022
0 4016-05-31 14:46:16.000 M06091 05_Май MCV11 A0022


Желаемый результат


[_Fld7425] [_Fld7414] [_Fld7416] [Месяц] [Код Торгового агента] [Код контрагента]
0 4016-05-31 14:46:16.000 M06091 05_Май MCV11 A0022
1 июн 16, 11:25    [19244654]     Ответить | Цитировать Сообщить модератору
 Re: Выбор значения поля за последнюю дату добавления записи.  [new]
Добрый Э - Эх
Guest
Staxs,

юзабильный - подразумевается, что его можно использовать. в том смысле, что скопировал из окна браузера, вставил в окно каталки скриптов, нажал кнопку и оно заработало.
почитай на досуге. в особенности пункт №6, пример хорошего стиля
1 июн 16, 11:40    [19244769]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить