Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку данных / 4 сообщений из 4, страница 1 из 1
09.11.2020, 16:36
    #40016574
Alkifr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку данных
Добрый день!

Не могу решить казалось бы простой кейс.
Есть 2 таблицы.
1 таблица, в которой хранится информация о периоде, цене и есть некий фильтр:
NameDate_stDate_endPriceFilterABC10.10.2010.11.201000ABC01.11.2005.11.20200xxx
2 таблица, в которой хранится список событий
NameDate_actionFilterABC15.10.20 xxx ABC18.10.2020yyyABC21.10.2020zzzABC24.10.2020xyzABC27.10.2020xzyABC30.10.2020yyyABC02.11.2020zyxABC05.11.2020 xxx ABC08.11.2020aaaABC11.11.2020bbb

А на выходе должна получиться вот такая таблица. Т.е. нужно организовать поиск по дате начала и дате окончания события, и по фильтру. Если фильтр пустой, то применяется цена для всех событий, а для фильтра xxx, только та цена, для какого периода она действительна.
NAMEDate_durFilterPriceABC15.10.2020 xxx 1000ABC18.10.2020yyy 1000ABC21.10.2020zzz 1000ABC24.10.2020xyz 1000ABC27.10.2020xzy 1000ABC30.10.2020yyy 1000ABC02.11.2020zyx 1000ABC05.11.2020 xxx 200ABC08.11.2020aaa 1000ABC11.11.2020bbb 1000

Очень прошу помощи, хотя бы наводку, в какую сторону копать, чтобы получить необходимый результат.
...
Рейтинг: 0 / 0
09.11.2020, 19:07
    #40016614
londinium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку данных
на представленных вкачествеобразца данных и без претензий

Код: 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.
USE master
GO

WITH FilterTable(Namen,StartDate,StopDate,Price,Filterr)AS
(
  SELECT 'ABC','20201010','20201110',1000.00,''
   UNION ALL
  SELECT 'ABC','20201101','20201105',200.00,'XXX'
),
ActionsTable(NameN,DateAction,Filter) AS
(
  SELECT 'ABC','20201015','XXX'
   UNION ALL
  SELECT 'ABC','20201018','YYY'
   UNION ALL
  SELECT 'ABC','20201021','ZZZ'
   UNION ALL
  SELECT 'ABC','20201024','XYZ'
   UNION ALL
  SELECT 'ABC','20201027','XZY'
   UNION ALL
  SELECT 'ABC','20201030','YYY'
   UNION ALL
  SELECT 'ABC','20201102','ZYX'
   UNION ALL
 SELECT 'ABC','20201105','XXX'
  UNION  ALL
 SELECT 'ABC','20201108','AAA'
  UNION ALL
 SELECT 'ABC','20201111','BBB'  
)
SELECT C.NameN,C.DateAction,C.Filter,X.Price,X2.Price,
CASE 
 WHEN X2.PRICE IS NULL THEN X.PRICE
 ELSE X2.PRICE
END AS FLAG_1
FROM ActionsTable C
CROSS  APPLY
(  
  SELECT TOP 1 F.Price
   FROM FilterTable F
   WHERE F.Namen=C.NameN AND C.DateAction BETWEEN F.StartDate AND F.StopDate

)X
OUTER APPLY 
(  
  SELECT TOP 1 F.Price
   FROM FilterTable F
   WHERE F.Namen=C.NameN AND C.DateAction BETWEEN F.StartDate AND F.StopDate
   AND C.Filter=F.Filterr

)X2
...
Рейтинг: 0 / 0
09.11.2020, 21:32
    #40016648
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку данных
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT C.NameN,cast (C.DateAction as datetime) as DateAction ,C.Filter,
			isnull(
				(select top 1 F.Price  from FilterTable F 
					where C.DateAction  between  F.StartDate and F.StopDate
					and F.Filterr=C.Filter),
				(select top 1 F.Price  from FilterTable F 
					where C.DateAction  between  F.StartDate and F.StopDate
				)
			 )
			 as Price
FROM ActionsTable C
...
Рейтинг: 0 / 0
10.11.2020, 07:26
    #40016725
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку данных
Alkifr
Если фильтр пустой
Это пустая строка или это NULL?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку данных / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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