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

Откуда:
Сообщений: 23
Есть 2 таблицы: КурсВалюты, Продажи.

В КурсВалюты содержится : датаКурса, наименование валюты, курс.

В Продажи: ДатаПродажи, наименование валюты, цена.

Нужно составить запрос, который будет находить нужный курс и умножать на цену. Если на дату продажи нету курса по заданной валюте , искать ближайшую ранее датуКурса с курсом по нужной валюте. требуется реализовать используя OUTER APPLY(не процедурой). Какие варианты?
24 ноя 13, 21:16    [15182296]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
shoxel
Какие варианты?
1. Изучить как работает OUTER APPLY и написать запрос самостоятельно;
2. Обратиться на форум "Работа" - там помогут.
24 ноя 13, 21:23    [15182312]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
shoxel
Member

Откуда:
Сообщений: 23
invm,
SELECT distinct
s.[Time_MemberId]
,tabl.Time_MemberId as timeCurrency
,s.[Currency_MemberId]

,s.[Value_Count]
,total=case
WHEN dc.MemberId=s.Currency_MemberId then s.Value_Price
WHEN tabl.Currency_MemberId IS NOT NULL AND tabl.Currency_MemberId!=s.Currency_MemberId THEN tabl.Value_Currency*s.Value_Count
ELSE null
END
,[Value_PriceCkidka]
,[Value_NDS]
,s.[1C]
FROM [dbo].[Rg_Sales] as s
CROSS JOIN dbo.Dim_Currency as dc
OUTER APPLY (SELECT top 1 * FROM Rg_Currency c
Where c.[1C]=s.[1C] AND
CONVERT(varchar, s.[Time_MemberId], 112) >= CONVERT(varchar, c.[Time_MemberId], 112)

ORDER BY CONVERT(varchar, c.[Time_MemberId], 112) desc) as tabl

ORDER BY tabl.Time_MemberId

изучил и есть косяки. вот и спросил какие варианты могут быть, чтобы увидеть мой недочет. А твой ответ - шлак....
24 ноя 13, 21:28    [15182327]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
shoxel
Member

Откуда:
Сообщений: 23
тем более разбираться в моем запросе никому нету смысла. поэтому привел простенький пример по которому всё наглядно можно описать.
24 ноя 13, 21:30    [15182333]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
shoxel
А твой ответ - шлак....
Конечно шлак. Ведь там нет готового решения. А думать самому - так противно...

Подсказки:
- dbo.Dim_Currency не нужна
- в OUTER APPLY добавить фильтр по валюте
- убрать конвертацию дат в строку
24 ноя 13, 21:48    [15182366]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
shoxel
Member

Откуда:
Сообщений: 23
invm,
SELECT
s.[Time_MemberId]
,tabl.Time_MemberId as timeCurrency
,s.[Currency_MemberId]
,s.[Value_Count]
,total=tabl.Value_Currency*s.Value_Count*s.value_price
,s.[1C]
FROM [dbo].[Rg_Sales] as s
OUTER APPLY (SELECT top 1 * FROM Rg_Currency c
Where s.[Time_MemberId] >= c.[Time_MemberId]
and c.[1C]=s.[1C]
and c.Currency_MemberId=s.Currency_MemberId
ORDER BY CONVERT(varchar, c.[Time_MemberId], 112) desc) as tabl


ORDER BY tabl.Time_MemberId

так и было первоначально.. но проблема, что берет самую раннюю запись валюты(1980 года) для всех строк
24 ноя 13, 22:22    [15182455]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
qwerty112
Guest
shoxel
invm,
SELECT
s.[Time_MemberId]
,tabl.Time_MemberId as timeCurrency
,s.[Currency_MemberId]
,s.[Value_Count]
,total=tabl.Value_Currency*s.Value_Count*s.value_price
,s.[1C]
FROM [dbo].[Rg_Sales] as s
OUTER APPLY (SELECT top 1 * FROM Rg_Currency c
Where s.[Time_MemberId] >= c.[Time_MemberId]
and c.[1C]=s.[1C]
and c.Currency_MemberId=s.Currency_MemberId
ORDER BY CONVERT(varchar, c.[Time_MemberId], 112) desc) as tabl


ORDER BY tabl.Time_MemberId

так и было первоначально.. но проблема, что берет самую раннюю запись валюты(1980 года) для всех строк

ты жж строку сортируешь, а не дату,
уже про это, invm говорил
24 ноя 13, 22:28    [15182473]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
shoxel
Member

Откуда:
Сообщений: 23
qwerty112,
да также сортирует.

SELECT
s.[Time_MemberId]
,tabl.Time_MemberId as timeCurrency
,s.[Currency_MemberId]
,s.[Value_Count]
,total=tabl.Value_Currency*s.Value_Count*s.value_price
,s.[1C]
FROM [dbo].[Rg_Sales] as s
OUTER APPLY (SELECT top 1 * FROM Rg_Currency c
Where s.[Time_MemberId] >= c.[Time_MemberId]
and c.[1C]=s.[1C]
and c.Currency_MemberId=s.Currency_MemberId
ORDER BY c.[Time_MemberId] desc) as tabl


ORDER BY tabl.Time_MemberId

всё равно из таблицы курсов берет наименьшую дату
24 ноя 13, 22:32    [15182487]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
invm
Member

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

Чудес не бывает:
declare @r table (c_id int not null, dt datetime not null, r numeric(18,4));
declare @s table (sale_id int not null, dt datetime not null, c_id int not null, price numeric(18,2) not null);

insert into @r
values
 (1, '20130101 10:00', 30),
 (1, '20130101 11:00', 31),
 (1, '20130201 10:00', 29);

insert into @s
values
 (1, '20121231', 1, 1),
 (1, '20130101 10:03', 1, 1),
 (1, '20130101 11:03', 1, 1),
 (1, '20130301', 1, 1);

select
 s.*, s.price * t.r
from
 @s s outer apply
 (select top (1) r from @r r where r.c_id = s.c_id and r.dt <= s.dt order by r.dt desc) t
order by
 s.dt;


Скорее всего тип [Time_MemberId] не дата.
24 ноя 13, 22:42    [15182510]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
qwerty112
Guest
shoxel
qwerty112,
да также сортирует.

SELECT 
      s.[Time_MemberId]
      ,tabl.Time_MemberId as timeCurrency
      ,s.[Currency_MemberId]
      ,s.[Value_Count]
      ,total=tabl.Value_Currency*s.Value_Count*s.value_price
      ,s.[1C]
  FROM [dbo].[Rg_Sales] as s 
  OUTER APPLY (SELECT top 1 *  FROM Rg_Currency c 
  Where  s.[Time_MemberId] >= c.[Time_MemberId]
  and  c.[1C]=s.[1C]
  and c.Currency_MemberId=s.Currency_MemberId 
ORDER BY c.[Time_MemberId] desc) as tabl  
 
ORDER BY tabl.Time_MemberId


всё равно из таблицы курсов берет наименьшую дату

значит нет курса, для этих условий
  and  c.[1C]=s.[1C]
  and c.Currency_MemberId=s.Currency_MemberId 
позже
24 ноя 13, 22:43    [15182511]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
shoxel
Member

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

есть курсы как минимум за 2010 год.
24 ноя 13, 22:55    [15182556]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
shoxel
Member

Откуда:
Сообщений: 23
invm,
тип дата...

Спасибо откликнувшимся.. буду искать косяки ..)
24 ноя 13, 22:56    [15182559]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
qwerty112
Guest
shoxel
qwerty112,

есть курсы как минимум за 2010 год.

друх, ну кто ж тебе на слово тут верить будет ??

выкладуй скрипты воспроизведения ошибки - тогда можно будет о чём-то говорить !
а так, угадывать где ты "нахомутал" - удовольствия мало
24 ноя 13, 23:00    [15182581]     Ответить | Цитировать Сообщить модератору
 Re: помогите с OUTER APPLY  [new]
shoxel
Member

Откуда:
Сообщений: 23
Как оказалось, всё работает адекватно) итоговая таблицы просто содержит 99% курс по рублю причем 1с=москва... а из таблицы курсов этому соответствует лишь 1980 год)

скажите, а вот такой запрос можно считать аналогичным?
SELECT
s.Time_MemberId


,[Currency_MemberId]
, [Value_Price]
,VALUE_PRICEE=[Value_Price]*(select top 1 value_currency from StandartPark.dbo.rg_currency as c
where CONVERT(varchar, s.[Time_MemberId], 112) >= CONVERT(varchar, c.[Time_MemberId], 112)
and s.Currency_MemberId=c.Currency_MemberId
and s.[1C]=c.[1C]



order by CONVERT(varchar, c.[Time_MemberId], 112) desc
)
,[Value_Count]
,[Value_Price]
,[Value_PriceCkidka]
,[Value_NDS]

FROM StandartPark.[dbo].[Rg_Sales] as s
24 ноя 13, 23:21    [15182658]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить