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

Откуда: Киев, Украина
Сообщений: 16
не могу подобрать подходящую функцию или логику, что бы найти значение поля [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] - номера недель
13 июл 18, 16:19    [21569424]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7401
boa_KAA,

selec f1 from t1 where t1.f1 = (select max(t2.f2) from t2)
13 июл 18, 18:03    [21569698]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
SELECT TOP(1) WITH TIES * FROM ... ORDER BY [Date] DESC, [DistributorID] DESC;


P.S. Спойлер не читал. Поэтому и зрение своё сохранил.
13 июл 18, 18:28    [21569745]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
iap,
вот и получается, что в from одного поля надо практически весь данный запрос дублировать, а я надеялся какое-то более изящное решение найти.
13 июл 18, 19:47    [21569844]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
Владислав Колосов,

могли бы на моем примере показать?
14 июл 18, 01:31    [21570257]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
asdor
Member

Откуда: Москва
Сообщений: 468
boa_KAA
Владислав Колосов,

могли бы на моем примере показать?

Я не Влад, но скажу. )))
Перепишите запрос в понятном виде, а не так как вам его сформировала студия.
ТОгда возможно логика будет яснее. используйте алиасы.
В общем случае, не понятно, почему непонятны ясные ответы.
14 июл 18, 08:59    [21570415]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
asdor,

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

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

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

Но как это реализовать я не знаю
14 июл 18, 11:34    [21570602]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30801
boa_KAA
Но при вставке на форум исчезли все отступы и поэтому код имеет не совсем читабельный вид.
Нужно выделить исходный код, и нажать кнопочку "исходный код" в интерфейсе публикации поста в форуме.

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

Но запросы у вас странные, ведь MAX для даты и ИД будут относиться к разным записям.
14 июл 18, 11:57    [21570617]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
alexeyvg
Нужно сделать FULL JOIN первого и второго запроса по [RetailID], и брать [RetailID], [DistributorID] по ISNULL из первого или второго набора.

Спасибо, в понедельник, попробую разобраться. дома нет доступа к базе
Пробовал через OUTER JOIN, но что-то у меня ничего не вышло.

alexeyvg
Но запросы у вас странные, ведь MAX для даты и ИД будут относиться к разным записям.

вы имели ввиду
SELECT MAX([ID]) AS [ID], MAX(DATEADD(dd, [Week] * 7 - 1, @date)-2) AS [Date]

здесь все просто, для данного запроса я делал группировку по RetailID и получал последний ИД-шник записи соответствующей последней отгрузке для каждого клиента и уже из этой строки вытягивал DistributorID
Может, конечно, кривовато, но работает.
14 июл 18, 12:39    [21570651]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30801
boa_KAA
alexeyvg
Но запросы у вас странные, ведь MAX для даты и ИД будут относиться к разным записям.

вы имели ввиду
SELECT MAX([ID]) AS [ID], MAX(DATEADD(dd, [Week] * 7 - 1, @date)-2) AS [Date]


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


boa_KAA
alexeyvg
Нужно сделать FULL JOIN первого и второго запроса по [RetailID], и брать [RetailID], [DistributorID] по ISNULL из первого или второго набора.

Спасибо, в понедельник, попробую разобраться. дома нет доступа к базе
Если в лоб, то как то так:
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, то можно и проще написать.
14 июл 18, 16:01    [21570833]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
Спасибо, alexeyvg,
alexeyvg
Но стоит, например, добавить какие то данные в процессе ручных фиксов или загрузок, как этот запрос будет выдавать неправильный результат.

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

alexeyvg
Если иметь справочник RetailID, то можно и проще написать.

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

Вообще-то это часть запроса, весь запрос ~6тыс. знаков
в итоге получаю справочник с реквизитами клиентов, последнюю активность(склад, дата) и тотальные продажи за последние 3 года по годам, за текущий год и за последний месяц.
14 июл 18, 20:16    [21571076]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
uaggster
Member

Откуда:
Сообщений: 767
boa_KAA
iap,
вот и получается, что в from одного поля надо практически весь данный запрос дублировать, а я надеялся какое-то более изящное решение найти.

А в чем проблема?
Перенесите его в СТЕ.
14 июл 18, 20:54    [21571120]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30801
boa_KAA
справочник есть tblRetail и в нем соответствующее поле ID, и этот запрос потом к нему линкуется
Тогда так попробуйте
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
14 июл 18, 23:42    [21571400]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34592
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!
15 июл 18, 09:49    [21571669]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
alexeyvg,
Спасибо,
очень интересно, завтра же займусь. Опреатор apply никогда не использовал, но что-то нагуглю.
но кажется, если следовать логике, то в ORDER BY вложенных запросов [SW] и [SМ] надо, все таки не [ID] сортировать, а дату.
И тут сразу вопрос, будет ли отличаться скорость выполнения
если сортировать преобразованную дату от
если сортировать "склееные" поля Year & Month(Week) приведенные к строке?
15 июл 18, 12:56    [21571842]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
MasterZiv
Тебе нужен запрос.
Конкретнее - select!

Вот честное слово, понятия не имею о чем это вы.
15 июл 18, 12:58    [21571847]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30801
boa_KAA
но кажется, если следовать логике, то в ORDER BY вложенных запросов [SW] и [SМ] надо, все таки не [ID] сортировать, а дату.
Ну, вы же брали макс. ID? Я просто повторил логику в своём варианте. Но по бизнес логике наверняка нужно сортировать по дате.

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

Кроме того, сортировать лучше по дате, а не склеенному значению, ведь логика сортировки от этого не меняется, правда? Более того, тут нужно правильно сформулировать бизнес-задачу. Если требуется "взять последнее", а сортировать будем по склеенному значению, то мы получим неправильный DistributorID
15 июл 18, 13:20    [21571863]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
alexeyvg,

alexeyvg
Скорость зависит от индексов, есть разные варианты, и их много. В общем случае максимальную скорость можно получить при сортировке по полю даты.

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

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

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

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

alexeyvg
Если требуется "взять последнее", а сортировать будем по склеенному значению, то мы получим неправильный DistributorID

Это условие из-за которого все и началось. В одном временном промежутке (месяц/неделя) может быть 2 и более DistributorID, нужно вычленить последнего, т.е. запись с максимальным ИД для последнего временного периода имеющегося в базе в таблицах Сэлс.
15 июл 18, 16:43    [21572100]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30801
boa_KAA
Так вот суть вопроса в следующем: что быстрее будет сортироваться строка из чисел или дата, или строка из чисел преобразованая в бигинтегер, для двух одних и тех же полей без учета индексов?
Разницы особой нет.
boa_KAA
alexeyvg
Если требуется "взять последнее", а сортировать будем по склеенному значению, то мы получим неправильный DistributorID

Это условие из-за которого все и началось. В одном временном промежутке (месяц/неделя) может быть 2 и более DistributorID, нужно вычленить последнего, т.е. запись с максимальным ИД для последнего временного периода имеющегося в базе в таблицах Сэлс.
Тогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.
15 июл 18, 17:22    [21572152]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
alexeyvg
Тогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.

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

А вот с этим абсолютно согласен. и после того как адаптирую ваш код под свои нужды, обязательно это учту.
15 июл 18, 19:27    [21572319]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
alexeyvg
Тогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.

сорри, опять протупил
конечно сортировку :)
найти записи с максимальной датой, отсортировать с параметром desc и взять top 1
15 июл 18, 19:39    [21572348]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30801
boa_KAA
alexeyvg
Тогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.

в том то и дело, что уже нет, есть перезалитые периоды.

boa_KAA
alexeyvg
Тогда можно просто делать сортировку по ID, ведь в любом случае бОльшие значения означают более поздние записи.

сорри, опять протупил
конечно сортировку :)
найти записи с максимальной датой, отсортировать с параметром desc и взять top 1
Собственно, это не вопросы по MSSQL, это вопросы бизнес-логики.
Тут важно, что такая конструкция с OUTER APPLY позволяет легко сделать любую сортировку, взяв нужную запись в соответствии с бизнес-логикой.
15 июл 18, 20:37    [21572467]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения одного поля по максимальному значению другого  [new]
boa_KAA
Member

Откуда: Киев, Украина
Сообщений: 16
В итоге получился следующий код

+
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) и другим участникам за помощь
16 июл 18, 16:25    [21575323]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить