powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск значения одного поля по максимальному значению другого
23 сообщений из 23, страница 1 из 1
Поиск значения одного поля по максимальному значению другого
    #39673805
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не могу подобрать подходящую функцию или логику, что бы найти значение поля [DistributorID] соответствующее максимальному значению поля [Date]

SET DATEFIRST 1
DECLARE @last_month int = 6;
DECLARE @last_year int = 2018;
DECLARE @FirstYear int = 2015;
Declare @Last_Day datetime = CONVERT(datetime, CONVERT(varchar, @last_month) + '/1/' + CONVERT(varchar, @last_year), 101);
Declare @Last_Week int = datepart(isowk, dateadd(month,1,dateadd(day,1-day(@Last_Day),@Last_Day))-1)-1;
Declare @date datetime = CONVERT(varchar, '01/01/' + CONVERT(varchar, CASE WHEN @last_year != DATEPART(year, getdate()-10) THEN (DATEPART(year, getdate()-10)) ELSE @last_year END), 101);
Declare @sDay int = DatePart(dw, @date);
Set @date = @date - @sDay + 1 + CASE WHEN @sDay > 4 then 7 else 0 END;

SELECT [RetailID], MAX([DistributorID]) AS [DistributorID], MAX([Date]) AS [LastDate]
FROM ( SELECT [RetailID], [DistributorID], [Date]
FROM (SELECT MAX([ID]) AS [ID], MAX(DATEADD(dd, [Week] * 7 - 1, @date)-2) AS [Date]
FROM [tblSaleWeek]
WHERE ([year] = @last_year)
GROUP BY [RetailID]) AS [SW]
INNER JOIN [tblSaleWeek] AS [S] ON [SW].[ID]=[S].[ID]
UNION
SELECT [RetailID], [DistributorID], [Date]
FROM (SELECT MAX([ID]) AS [ID], DATEADD(mm, 1, MAX(CONVERT(datetime, CONVERT(varchar, [Month]) + '/1/' + CONVERT(varchar, [year]), 101) ) )-1 AS [Date]
FROM [tblSale]
WHERE [Packs_sold] > 0 AND [year] BETWEEN @FirstYear AND @last_year-1
GROUP BY [RetailID]) AS [SM]
INNER JOIN [tblSale] AS [S] ON [SM].[ID]=[S].[ID]
) AS [D]
GROUP BY [RetailID]
order by 3 desc


вместо MAX([DistributorID]) должно быть последнее значение [DistributorID] из строки в которой поле [Date] равно значению MAX([Date])
Таблицы [tblSale] и [tblSaleWeek] одинаковые по структуре. за исключением одного поля в [tblSale] поле [Month] (int) , а в [tblSaleWeek] такое же поле называется [Week]
В поле [Month] - номера месяцев, а в поле [Week] - номера недель
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39673857
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boa_KAA,

selec f1 from t1 where t1.f1 = (select max(t2.f2) from t2)
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39673864
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
SELECT TOP(1) WITH TIES * FROM ... ORDER BY [Date] DESC, [DistributorID] DESC;



P.S. Спойлер не читал. Поэтому и зрение своё сохранил.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39673889
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,
вот и получается, что в from одного поля надо практически весь данный запрос дублировать, а я надеялся какое-то более изящное решение найти.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39673926
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

могли бы на моем примере показать?
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39673944
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boa_KAAВладислав Колосов,

могли бы на моем примере показать?
Я не Влад, но скажу. )))
Перепишите запрос в понятном виде, а не так как вам его сформировала студия.
ТОгда возможно логика будет яснее. используйте алиасы.
В общем случае, не понятно, почему непонятны ясные ответы.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39673967
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asdor,

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

Как я уже писал в первом сообщении есть две таблицы. Мне надо выбрать список уникальных клиентов(RetailID) с послендней датой отгрузки AS [LastDate] и последним складом с которого грузились (DistributorID). Этот список выбирается за последние 3 года + текущий.
отдельно из каждой таблицы я данный список получаю, но при объединении результатов, естественно, появляются дубли [RetailID]. Группировка по полям [RetailID] и [DistributorID] не дает нужного результата, т.к. клиент(RetailID) мог в прошлых годах грузится с другого склада (DistributorID), а надо выбрать именно последний.

Данные по текущему году выбираются из таблицы tblSaleWeek, а предыдущие года из таблицы tblSale поэтому:
1) в конечный результат можно взять все значения полученные из tblSaleWeek и дополнить недостающими RetailID из отчета полученного из tblSale.
2) Либо в объединенном отчете выбрать DistributorID соответствующий максимальной дате.

Но как это реализовать я не знаю
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39673970
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boa_KAAНо при вставке на форум исчезли все отступы и поэтому код имеет не совсем читабельный вид.Нужно выделить исходный код, и нажать кнопочку "исходный код" в интерфейсе публикации поста в форуме.

boa_KAA1) в конечный результат можно взять все значения полученные из tblSaleWeek и дополнить недостающими RetailID из отчета полученного из tblSale.Это называется "связать", а не "объединить". Нужно сделать FULL JOIN первого и второго запроса по [RetailID], и брать [RetailID], [DistributorID] по ISNULL из первого или второго набора.

Но запросы у вас странные, ведь MAX для даты и ИД будут относиться к разным записям.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39673977
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgНужно сделать FULL JOIN первого и второго запроса по [RetailID], и брать [RetailID], [DistributorID] по ISNULL из первого или второго набора.
Спасибо, в понедельник, попробую разобраться. дома нет доступа к базе
Пробовал через OUTER JOIN, но что-то у меня ничего не вышло.

alexeyvgНо запросы у вас странные, ведь MAX для даты и ИД будут относиться к разным записям.
вы имели ввиду
Код: sql
1.
SELECT MAX([ID]) AS [ID], MAX(DATEADD(dd, [Week] * 7 - 1, @date)-2) AS [Date]


здесь все просто, для данного запроса я делал группировку по RetailID и получал последний ИД-шник записи соответствующей последней отгрузке для каждого клиента и уже из этой строки вытягивал DistributorID
Может, конечно, кривовато, но работает.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674020
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boa_KAAalexeyvgНо запросы у вас странные, ведь MAX для даты и ИД будут относиться к разным записям.
вы имели ввиду
Код: sql
1.
SELECT MAX([ID]) AS [ID], MAX(DATEADD(dd, [Week] * 7 - 1, @date)-2) AS [Date]



здесь все просто, для данного запроса я делал группировку по RetailID и получал последний ИД-шник записи соответствующей последней отгрузке для каждого клиента и уже из этой строки вытягивал DistributorIDЯ не про DistributorID, а про [Date], она то "вытягивается" неправильно.
Кривовато, и работает только потому, что у вас наверняка даты монотонно возрастают одновременно с ростом ID
Но стоит, например, добавить какие то данные в процессе ручных фиксов или загрузок, как этот запрос будет выдавать неправильный результат. Хотя, может, вам так и надо, что бы DistributorID и [Date] были из разных записей?


boa_KAAalexeyvgНужно сделать FULL JOIN первого и второго запроса по [RetailID], и брать [RetailID], [DistributorID] по ISNULL из первого или второго набора.
Спасибо, в понедельник, попробую разобраться. дома нет доступа к базеЕсли в лоб, то как то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT [RetailID], isnull(d1.[DistributorID], d.[DistributorID]) as [DistributorID], isnull(d1.[Date], d.[Date]) AS [LastDate]
FROM (	
	SELECT [RetailID], [DistributorID], DATEADD(dd, [Week] * 7 - 1, @date) - 2 AS [Date]
	FROM (
		SELECT MAX([ID]) AS [ID]
		FROM [tblSaleWeek]
		WHERE ([year] = @last_year)
		GROUP BY [RetailID]
	) AS [SW]
		INNER JOIN [tblSaleWeek] AS [S] ON [SW].[ID]=[S].[ID]
) as D1
FULL JOIN (
	SELECT [RetailID], [DistributorID], DATEADD(mm, 1, CONVERT(datetime, CONVERT(varchar, [Month]) + '/1/' + CONVERT(varchar, [year]), 101) ) - 1 AS [Date]
	FROM (
		SELECT MAX([ID]) AS [ID]
		FROM [tblSale] 
		WHERE [Packs_sold] > 0 AND [year] BETWEEN @FirstYear AND @last_year-1
		GROUP BY [RetailID]
	) AS [SM]
		INNER JOIN [tblSale] AS [S] ON [SM].[ID]=[S].[ID]
) AS [D] ON [D].[RetailID] = D1.[RetailID]
order by 3 desc


boa_KAAПробовал через OUTER JOIN, но что-то у меня ничего не вышло.Если иметь справочник RetailID, то можно и проще написать.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674048
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, alexeyvg,
alexeyvgНо стоит, например, добавить какие то данные в процессе ручных фиксов или загрузок, как этот запрос будет выдавать неправильный результат.
точно, я это уже позже понял, после вашего замечания, но у нас действительно данные добавляются по наростающей, поэтому ошибка и не бросилась в глаза.

alexeyvgЕсли иметь справочник RetailID, то можно и проще написать.
справочник есть tblRetail и в нем соответствующее поле ID, и этот запрос потом к нему линкуется

Вообще-то это часть запроса, весь запрос ~6тыс. знаков
в итоге получаю справочник с реквизитами клиентов, последнюю активность(склад, дата) и тотальные продажи за последние 3 года по годам, за текущий год и за последний месяц.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674056
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
boa_KAAiap,
вот и получается, что в from одного поля надо практически весь данный запрос дублировать, а я надеялся какое-то более изящное решение найти.
А в чем проблема?
Перенесите его в СТЕ.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674078
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boa_KAAсправочник есть tblRetail и в нем соответствующее поле ID, и этот запрос потом к нему линкуетсяТогда так попробуйте
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT r.[RetailID], isnull([SW].[DistributorID], [SM].[DistributorID]) as [DistributorID], isnull([SW].[Date], [SM].[Date]) AS [LastDate]
FROM tblRetail r
	outer apply ( 
		SELECT top 1 [ID], [RetailID], [DistributorID], DATEADD(dd, [Week] * 7 - 1, @date) - 2 AS [Date]
		FROM [tblSaleWeek] s
		WHERE ([year] = @last_year) and s.[RetailID] = t.[RetailID]
		ORDER BY [ID] desc
	    ) AS [SW]
	outer apply ( 
		SELECT top 1 [ID], [RetailID], [DistributorID], DATEADD(mm, 1, CONVERT(datetime, CONVERT(varchar, [Month]) + '/1/' + CONVERT(varchar, [year]), 101) ) - 1 AS [Date]
		FROM [tblSale] s
		WHERE [Packs_sold] > 0 AND [year] BETWEEN @FirstYear AND @last_year-1 and s.[RetailID] = t.[RetailID]
		ORDER BY [ID] desc
	    ) AS [SM]
order by 3 desc
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674100
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boa_KAAне могу подобрать подходящую функцию или логику, что бы найти значение поля [DistributorID] соответствующее максимальному значению поля [Date]

SET DATEFIRST 1
DECLARE @last_month int = 6;
DECLARE @last_year int = 2018;
DECLARE @FirstYear int = 2015;
Declare @Last_Day datetime = CONVERT(datetime, CONVERT(varchar, @last_month) + '/1/' + CONVERT(varchar, @last_year), 101);
Declare @Last_Week int = datepart(isowk, dateadd(month,1,dateadd(day,1-day(@Last_Day),@Last_Day))-1)-1;
Declare @date datetime = CONVERT(varchar, '01/01/' + CONVERT(varchar, CASE WHEN @last_year != DATEPART(year, getdate()-10) THEN (DATEPART(year, getdate()-10)) ELSE @last_year END), 101);
Declare @sDay int = DatePart(dw, @date);
Set @date = @date - @sDay + 1 + CASE WHEN @sDay > 4 then 7 else 0 END;

SELECT [RetailID], MAX([DistributorID]) AS [DistributorID], MAX([Date]) AS [LastDate]
FROM ( SELECT [RetailID], [DistributorID], [Date]
FROM (SELECT MAX([ID]) AS [ID], MAX(DATEADD(dd, [Week] * 7 - 1, @date)-2) AS [Date]
FROM [tblSaleWeek]
WHERE ([year] = @last_year)
GROUP BY [RetailID]) AS [SW]
INNER JOIN [tblSaleWeek] AS [S] ON [SW].[ID]=[S].[ID]
UNION
SELECT [RetailID], [DistributorID], [Date]
FROM (SELECT MAX([ID]) AS [ID], DATEADD(mm, 1, MAX(CONVERT(datetime, CONVERT(varchar, [Month]) + '/1/' + CONVERT(varchar, [year]), 101) ) )-1 AS [Date]
FROM [tblSale]
WHERE [Packs_sold] > 0 AND [year] BETWEEN @FirstYear AND @last_year-1
GROUP BY [RetailID]) AS [SM]
INNER JOIN [tblSale] AS [S] ON [SM].[ID]=[S].[ID]
) AS [D]
GROUP BY [RetailID]
order by 3 desc


вместо MAX([DistributorID]) должно быть последнее значение [DistributorID] из строки в которой поле [Date] равно значению MAX([Date])
Таблицы [tblSale] и [tblSaleWeek] одинаковые по структуре. за исключением одного поля в [tblSale] поле [Month] (int) , а в [tblSaleWeek] такое же поле называется [Week]
В поле [Month] - номера месяцев, а в поле [Week] - номера недель


Тебе нужен запрос.
Конкретнее - select!
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674120
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,
Спасибо,
очень интересно, завтра же займусь. Опреатор apply никогда не использовал, но что-то нагуглю.
но кажется, если следовать логике, то в ORDER BY вложенных запросов [SW] и [SМ] надо, все таки не [ID] сортировать, а дату.
И тут сразу вопрос, будет ли отличаться скорость выполнения
если сортировать преобразованную дату от
если сортировать "склееные" поля Year & Month(Week) приведенные к строке?
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674121
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivТебе нужен запрос.
Конкретнее - select!
Вот честное слово, понятия не имею о чем это вы.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674125
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boa_KAAно кажется, если следовать логике, то в ORDER BY вложенных запросов [SW] и [SМ] надо, все таки не [ID] сортировать, а дату.Ну, вы же брали макс. ID? Я просто повторил логику в своём варианте. Но по бизнес логике наверняка нужно сортировать по дате.

boa_KAAИ тут сразу вопрос, будет ли отличаться скорость выполнения
если сортировать преобразованную дату от
если сортировать "склееные" поля Year & Month(Week) приведенные к строке?Скорость зависит от индексов, есть разные варианты, и их много. В общем случае максимальную скорость можно получить при сортировке по полю даты.

Кроме того, сортировать лучше по дате, а не склеенному значению, ведь логика сортировки от этого не меняется, правда? Более того, тут нужно правильно сформулировать бизнес-задачу. Если требуется "взять последнее", а сортировать будем по склеенному значению, то мы получим неправильный DistributorID
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674178
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

alexeyvgСкорость зависит от индексов, есть разные варианты, и их много. В общем случае максимальную скорость можно получить при сортировке по полю даты.
как такового поля даты нет.
если вы обратили внимание есть номер месяца/недели и год
отчеты в базу загружаются понедельно и/или помесячно, и поденной разбивки в них нет. Это я уже преобразую значения в дату, что бы потом проще было в Excel с ними работать. Но т.к. значения в полях интегер, то для правильной сортировки надо к номерам 1-9 добавлять ноль(это если склеивать в строку) или преобразовывать в дату(как я делал в коде выше). Но и в первом и во вторм варианте это "сборное" поле.
Так вот суть вопроса в следующем: что быстрее будет сортироваться строка из чисел или дата, или строка из чисел преобразованая в бигинтегер, для двух одних и тех же полей без учета индексов?

Хотя, наверное, я многого не знаю про индексы и их можно как-то добавлять на время сеанса...
Вообще-то у меня ограниченный доступ к базе и даже временную таблицу я в ней не могу создать(по крайней мере не получилось), а уж добавлять индексы к полям, наверное и подавно.

Плюс, данный запрос формируется в Excel и через OLEDB получает данные с SQL-сервера. И тут тоже веселуха, т.к. то, что знает MSSQL, не всегда понимает SQL в MSOffice и наоброт.

Про сортировку по "макс. ID" - это я ж выше писал, что протупил. Хоть оно сейчас и работает, "завтра", что-то поменяется и результат будет не правильным. Здесь я с вами абсолютно согласился. Иначе, зачем искать макс Дату, если проще по индексированному полю (ИД) найти макс и вытянуть с него и дату, и DistributorID.

alexeyvgЕсли требуется "взять последнее", а сортировать будем по склеенному значению, то мы получим неправильный DistributorID
Это условие из-за которого все и началось. В одном временном промежутке (месяц/неделя) может быть 2 и более DistributorID, нужно вычленить последнего, т.е. запись с максимальным ИД для последнего временного периода имеющегося в базе в таблицах Сэлс.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674200
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boa_KAAТак вот суть вопроса в следующем: что быстрее будет сортироваться строка из чисел или дата, или строка из чисел преобразованая в бигинтегер, для двух одних и тех же полей без учета индексов?Разницы особой нет.
boa_KAAalexeyvgЕсли требуется "взять последнее", а сортировать будем по склеенному значению, то мы получим неправильный DistributorID
Это условие из-за которого все и началось. В одном временном промежутке (месяц/неделя) может быть 2 и более DistributorID, нужно вычленить последнего, т.е. запись с максимальным ИД для последнего временного периода имеющегося в базе в таблицах Сэлс.Тогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674227
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgТогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.
в том то и дело, что уже нет, есть перезалитые периоды.
alexeyvgКривовато, и работает только потому, что у вас наверняка даты монотонно возрастают одновременно с ростом ID
Но стоит, например, добавить какие то данные в процессе ручных фиксов или загрузок, как этот запрос будет выдавать неправильный результат.
А вот с этим абсолютно согласен. и после того как адаптирую ваш код под свои нужды, обязательно это учту.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674229
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgТогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.
сорри, опять протупил
конечно сортировку :)
найти записи с максимальной датой, отсортировать с параметром desc и взять top 1
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674243
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boa_KAAalexeyvgТогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.
в том то и дело, что уже нет, есть перезалитые периоды.
boa_KAAalexeyvgТогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.
сорри, опять протупил
конечно сортировку :)
найти записи с максимальной датой, отсортировать с параметром desc и взять top 1Собственно, это не вопросы по MSSQL, это вопросы бизнес-логики.
Тут важно, что такая конструкция с OUTER APPLY позволяет легко сделать любую сортировку, взяв нужную запись в соответствии с бизнес-логикой.
...
Рейтинг: 0 / 0
Поиск значения одного поля по максимальному значению другого
    #39674586
boa_KAA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге получился следующий код

Код: 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.
SET DATEFIRST 1
DECLARE @last_month int = 6;
DECLARE @last_year int = 2018;
DECLARE @FirstYear int = 2015;
Declare @Last_Day datetime = CONVERT(datetime, CONVERT(varchar, @last_month) + '/1/' + CONVERT(varchar, @last_year), 101);
Declare @Last_Week int = datepart(isowk, dateadd(month,1,dateadd(day,1-day(@Last_Day),@Last_Day))-1)-1;
Declare @date datetime = CONVERT(varchar,   '01/01/' + CONVERT(varchar, CASE WHEN @last_year != DATEPART(year, getdate()-10) THEN (DATEPART(year, getdate()-10)) ELSE @last_year END), 101);
Declare @sDay int = DatePart(dw, @date);
Set @date = @date - @sDay + 1 + CASE WHEN @sDay > 4 then 7 else 0 END;

SELECT ISNULL([S1].[RetailID],[S2].[RetailID]) AS [RetailID], ISNULL([S1].[DistributorID], [S2].[DistributorID]) AS [DistributorID], ISNULL([S1].[Date], [S2].[Date]) AS [LastDate]
FROM (
	SELECT [T1].[RetailID], [SS].[DistributorID], [T1].[Date]
	FROM (	SELECT MAX([S].[ID]) AS [ID], [S].[RetailID], DATEADD(dd, [S].[Week] * 7 - 1,@date) - 2 AS [Date]
			FROM (SELECT [year], MAX([Week]) AS [Week], [RetailID]
				FROM [tblSaleWeek]
				WHERE [Packs_sold] > 0 AND ([year] = @last_year)
				GROUP BY [RetailID], [year]
				) AS [SW]
				INNER JOIN [tblSaleWeek] AS [S] ON [SW].[year] = [S].[year] AND [SW].[Week] = [S].[Week] AND [SW].[RetailID] = [S].[RetailID]
			GROUP BY [S].[RetailID], [S].[Week]
		) AS [T1]
		INNER JOIN [tblSaleWeek] AS [SS] ON [SS].[ID] = [T1].[ID]
	) AS [S1]
	FULL JOIN (
	SELECT [T2].[RetailID], [SS].[DistributorID],  [T2].[Date]
	FROM (	SELECT MAX([S].[ID]) AS [ID], [S].[RetailID], DATEADD(mm, 1, CONVERT(datetime, CONVERT(varchar, [Month]) + '/1/' + CONVERT(varchar, [year]), 101)) - 1 AS [Date]
			FROM (SELECT [RetailID], MAX(CONVERT(datetime, CONVERT(varchar, [Month]) + '/1/' + CONVERT(varchar, [year]), 101)) AS [Date]
				FROM [tblSale] 
				WHERE [Packs_sold] > 0 AND [year] BETWEEN @FirstYear AND @last_year - 1
				GROUP BY [RetailID]
				) AS [SM]
				INNER JOIN [tblSale] AS [S] ON [SM].[RetailID] = [S].[RetailID] AND YEAR([Date]) = [S].[year] AND MONTH([Date]) = [S].[Month]
			GROUP BY [S].[RetailID], [S].[year], [S].[Month]
		) AS [T2]
		INNER JOIN [tblSale] AS [SS] ON [SS].[ID] = [T2].[ID]
	) AS [S2] ON [S2].[RetailID] = [S1].[RetailID]
order by 3 desc



Спасибо Алексею(alexeyvg) и другим участникам за помощь
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск значения одного поля по максимальному значению другого
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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