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

Откуда:
Сообщений: 12
Доброго времени суток,

Помогите разобраться с некоторым запросом, а именно отбор по минимальной дате.

Такой вот запрос:
SELECT 
T_Models.ModelID,
MIN(T_Headers.Tdate) as 'DataPrihoda', 
T_Transactions.CostBase
FROM                 T_Headers left JOIN
                         T_Transactions ON T_Headers.ID = T_Transactions.ID_Headers left JOIN
                         T_PLU ON T_Transactions.ID_PLU = T_PLU.ID left JOIN
                         T_Models ON T_PLU.ID_Models = T_Models.ID left JOIN
			 T_Objects on T_Objects.ID = T_Headers.ID_ObjectsContr
where T_Models.ModelID ='R_MV858_108_588/010' 
and T_Headers.ID_Moves = 2  
and T_Headers.ID_Objects = 34  
and T_Headers.ID_ObjectsContr = 42638 
group by T_Models.ModelID,T_Transactions.CostBase

В итоге получается:

R_MV858_108_588/010	2019-09-24 00:00:00	3172.20
R_MV858_108_588/010	2019-09-24 00:00:00	3172.50
R_MV858_108_588/010	2019-08-09 00:00:00	5287.00
R_MV858_108_588/010	2019-06-18 00:00:00	5287.3333
R_MV858_108_588/010	2019-06-18 00:00:00	5287.50


И никак не могу добиться нужного результата.
По факту мне необходимо отобрать самую первую дату прихода и получить цену на эту дату
R_MV858_108_588/010	2019-06-18 00:00:00	5287.50

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

Каким образом добиться нужного результата?
22 ноя 19, 15:37    [22022994]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4683
оно?

SELECT TOP 1 WITH TIES 
T_Models.ModelID,
T_Headers.Tdate as [DataPrihoda] 
T_Transactions.CostBase
FROM T_Headers 
left JOIN T_Transactions ON T_Headers.ID = T_Transactions.ID_Headers 
left JOIN T_PLU ON T_Transactions.ID_PLU = T_PLU.ID 
left JOIN T_Models ON T_PLU.ID_Models = T_Models.ID 
left JOIN T_Objects on T_Objects.ID = T_Headers.ID_ObjectsContr
ORDER BY ROW_NUMBER() OVER (PARTITION BY T_Models.ModelID,T_Transactions.CostBase ORDER BY T_Headers.Tdate) 
22 ноя 19, 15:52    [22023023]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
orensymrak
Member

Откуда:
Сообщений: 12
R_MV858_108_588/010	2019-06-18 00:00:00	13592.00
R_MV858_108_588/010	2019-09-24 00:00:00	15192.00
R_MV858_108_588/010	2019-09-24 00:00:00	3172.20
R_MV858_108_588/010	2019-09-24 00:00:00	3172.50
R_MV858_108_588/010	2019-08-09 00:00:00	5287.00
R_MV858_108_588/010	2019-06-18 00:00:00	5287.3333
R_MV858_108_588/010	2019-06-18 00:00:00	5287.50


Вообще еще больше дал строк) Если без условия то 212+тыс строк, а артикулов 113тыс
22 ноя 19, 16:13    [22023049]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7663
первую дату есть 2 цены, и какая правильная цена неизвестно


В таком случае задача не имеет решения.
22 ноя 19, 16:41    [22023092]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4683
orensymrak,

уберите цену из PARTITION BY

SELECT TOP 1 WITH TIES 
T_Models.ModelID,
T_Headers.Tdate as [DataPrihoda] 
T_Transactions.CostBase
FROM T_Headers 
left JOIN T_Transactions ON T_Headers.ID = T_Transactions.ID_Headers 
left JOIN T_PLU ON T_Transactions.ID_PLU = T_PLU.ID 
left JOIN T_Models ON T_PLU.ID_Models = T_Models.ID 
left JOIN T_Objects on T_Objects.ID = T_Headers.ID_ObjectsContr
ORDER BY ROW_NUMBER() OVER (PARTITION BY T_Models.ModelID ORDER BY T_Headers.Tdate) 


При двух датах он выберет любую
22 ноя 19, 18:52    [22023216]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
orensymrak
Member

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

Так смысл и заключается что взять цену на минимальную дату)) Если убрать цену тогда да группировка правильно сработает)
25 ноя 19, 10:04    [22024345]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4683
orensymrak
a_voronin,

взять цену на минимальную дату))


цена стоит не в группировке

запустите запрос
25 ноя 19, 10:10    [22024350]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
orensymrak
Member

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

Не правильно прочитал ваше сообщение)) в вашем варианте да взялась нужная дата, а цена взялась некорректная
25 ноя 19, 10:18    [22024364]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
orensymrak
Member

Откуда:
Сообщений: 12
Еще вопросик задам тут же, можно ли в заголовок столбца (имя) вставить дату, например у меня 8 столбцов = 8 неделям от текущей даты, каким образом в заголовок отобразить эти даты.
вида 2611-1911

getDate()-7
26 ноя 19, 13:17    [22025554]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4683
orensymrak,

Вы в чем отображаете результаты? Если в репортинге, то это надо делать в матрице.

А вообще вам надо OLAP-кубы тогда делать, если вы хотите разворачивать данные по горизонтали.
26 ноя 19, 13:26    [22025572]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
orensymrak
Member

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

Ну так то запросы готовлю в SSMS, чтобы потом готовый результат внедрить в Excel
26 ноя 19, 14:06    [22025632]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Declare @sql varchar(4000),
@D_Beg as date = '20191101',
@D_End as date = '20191115';

With Per as (
Select @D_Beg as D
union all 
Select dateadd(d,1,D) from Per Where per.D<@D_End
)
Select @sql = cast('Select Consumer_ID' as varchar(max))+
      (Select ', sum(Case When D_Date = '''+convert(varchar(10),D,120)+''' then 1 End) as [Значение на '+convert(varchar(10),D,104)+']' From per for xml path(''))
	  
	  +' From Sales'
	  +' Where D_Date between '''+convert(varchar(10),@D_Beg,120)+''' and '''+convert(varchar(10),@D_End,120)+''' '
	  +' Group by Consumer_ID';

	print @sql
Exec (@sql);
27 ноя 19, 05:00    [22026213]     Ответить | Цитировать Сообщить модератору
 Re: МИН МАХ отбор по дате  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4683
Kopelly
Declare @sql varchar(4000),
@D_Beg as date = '20191101',
@D_End as date = '20191115';

With Per as (
Select @D_Beg as D
union all 
Select dateadd(d,1,D) from Per Where per.D<@D_End
)
Select @sql = cast('Select Consumer_ID' as varchar(max))+
      (Select ', sum(Case When D_Date = '''+convert(varchar(10),D,120)+''' then 1 End) as [Значение на '+convert(varchar(10),D,104)+']' From per for xml path(''))
	  
	  +' From Sales'
	  +' Where D_Date between '''+convert(varchar(10),@D_Beg,120)+''' and '''+convert(varchar(10),@D_End,120)+''' '
	  +' Group by Consumer_ID';

	print @sql
Exec (@sql);


Вот, чтобы через подобную хитрозакрученную динамическую ж..., запросы не писать и были придуманы OLAP-кубы.

Там пишется

SELECT 
X ON ROWS, 
Y ON COLUMNS 
FROM CUBE 
27 ноя 19, 17:28    [22026885]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить