Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
alex.l.o Member Откуда: Сообщений: 28 |
Добрый день, всем!!! Подскажите, пожалуйста, как сделать запрос. первый вариант работает отлично если в FROM добавили таблицу ExchangeRates( Вариант 2) тогда количество Документов становится больше ровно настолько сколько строк в справочнике (ExchangeRates) если реально документов 10 а в справочники(ExchangeRates) строк 4, то документов SELECT 40 вариант 1 comm1.CommandText = "SELECT * FROM DocumentSum INNER JOIN DocumentBody ON DocumentSum.IdDocumentBody = DocumentBody.Id INNER JOIN Document ON DocumentBody.IdDocument = Document.Id LEFT OUTER JOIN DocumentFixedAssets ON DocumentBody.Id = DocumentFixedAssets.IdDocumentBody WHERE (DocumentFixedAssets.IdDocumentBody IS NULL) вариант 2 comm2.CommandText = "SELECT * FROM DocumentSum INNER JOIN DocumentBody ON DocumentSum.IdDocumentBody = DocumentBody.Id INNER JOIN Document ON DocumentBody.IdDocument = Document.Id LEFT OUTER JOIN DocumentFixedAssets ON DocumentBody.Id = DocumentFixedAssets.IdDocumentBody INNER JOIN ExchangeRates ON Document.IdCurrency=ExchangeRates.IdDirectory2 WHERE (DocumentFixedAssets.IdDocumentBody IS NULL) AND (ExchangeRates.IdDirectory1=@VIdCurrencyM2)"; |
17 окт 16, 16:13 [19791223] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
|
||
17 окт 16, 16:44 [19791392] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
Уникального выбора нет только привязка к IdCurrency и Date |
17 окт 16, 16:46 [19791399] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
|
||
17 окт 16, 16:48 [19791405] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
ExchangeRates.Date <= Documtnt.Date это ничего не .... так как <= Date очень много. |
17 окт 16, 16:51 [19791419] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
ДОБАВИЛ Document.Date>=ExchangeRates.Date РЕЗУЛЬТАТ ТОТ ЖЕ вариант 2 comm2.CommandText = "SELECT * FROM DocumentSum INNER JOIN DocumentBody ON DocumentSum.IdDocumentBody = DocumentBody.Id INNER JOIN Document ON DocumentBody.IdDocument = Document.Id LEFT OUTER JOIN DocumentFixedAssets ON DocumentBody.Id = DocumentFixedAssets.IdDocumentBody INNER JOIN ExchangeRates ON Document.IdCurrency=ExchangeRates.IdDirectory2 WHERE (DocumentFixedAssets.IdDocumentBody IS NULL) AND (ExchangeRates.IdDirectory1=@VIdCurrencyM2) AND Document.Date>=ExchangeRates.Date"; |
17 окт 16, 16:57 [19791447] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
если
предполагая, что это у вас некие документы и котировки на дату (только исходя из названий, могу ошибиться) как у вас для одного документа и одной даты существует несколько котировок (или у вас там некие внутренние "типы рейтов")? |
||
17 окт 16, 17:04 [19791498] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
alex.l.o,ExchangeRates.Date <= Documtnt.Date ДОБАВИЛ Document.Date>=ExchangeRates.Date как это, вам всё равно? если курсы есть не на все даты, то по какому правилу определяются? |
17 окт 16, 17:10 [19791535] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
TaPaK, хотя о чём это я... вы просто местами переставляете и ожидаете другого результата? |
17 окт 16, 17:14 [19791559] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
что местами переставил ? я извиняюсь не понял. |
17 окт 16, 17:24 [19791612] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
вариант 2SELECT * FROM DocumentSum INNER JOIN DocumentBody ON DocumentSum.IdDocumentBody = DocumentBody.Id INNER JOIN Document ON DocumentBody.IdDocument = Document.Id LEFT OUTER JOIN DocumentFixedAssets ON DocumentBody.Id = DocumentFixedAssets.IdDocumentBody INNER JOIN ExchangeRates ON Document.IdCurrency=ExchangeRates.IdDirectory2 WHERE (DocumentFixedAssets.IdDocumentBody IS NULL) AND (ExchangeRates.IdDirectory1=@VIdCurrencyM2) AND (Document.Date>=ExchangeRates.Date);
Сообщение было отредактировано: 17 окт 16, 17:32 |
|
17 окт 16, 17:27 [19791623] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
alex.l.o, CROSS APPLY TOP 1 + ORDER BY или MIN/MAX в зависимости от того как условие на дату |
17 окт 16, 17:32 [19791650] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
спрашивает что такое GROSS ошибка AND Document.Date GROSS APPLY (SELECT TOP 1 ExchangeRates.Date) |
17 окт 16, 18:02 [19791822] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
alex.l.o, да ну нафик.... http://www.sql-tutorial.ru/ru/book_cross_apply.html |
17 окт 16, 18:03 [19791826] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
SELECT TOP 1 выдаст первою запись в справочнике ExchangeRates (какой курс ), а изменить, что либо в решении задачи TOP не поможет. |
17 окт 16, 19:14 [19792092] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
какую проблему это не решит? |
||
18 окт 16, 08:50 [19793023] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
А куда девать 40 документов |
18 окт 16, 15:15 [19795117] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
alex.l.o, имхо, вам сюда |
18 окт 16, 15:30 [19795212] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
Дедушка, Чем куда то посылать лучше помогли бы. Есть запрос впишите Ваш ТОР, если получится я буду Вам очень благодарен. У меня не получается потому что в справочник не каждый день заносится курс валют и Currency(доллар - рубль) повторяется очень часто. Потому уникального одного варианта достичь невозможно ТОР (1). |
18 окт 16, 16:09 [19795476] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
alex.l.o, уже писали CROSS APPLY ( SLECT TOP 1 <Rate> FROM Currency x WHERE <x.IdCurr> = <IdCurr> AND <x.Date> <= <Date> ORDER BY Date DESC ) as x |
18 окт 16, 16:16 [19795506] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
declare @doc table (id int, dt date, id_cur int) declare @cur table (id int, dt date, cur decimal(10,4)) insert @cur values(1,'2016-01-01', 10),(1,'2016-01-09', 11),(1,'2016-01-20', 20) insert @doc values(1,'2016-01-10',1),(2,'2016-01-21',1) select * from @doc dc cross apply(select top 1 cur from @cur cr where cr.id=dc.id_cur and cr.dt<=dc.dt order by cr.dt desc)c select *, (select top 1 cur from @cur cr where cr.id=dc.id_cur and cr.dt<=dc.dt order by cr.dt desc) as cur from @doc dc |
18 окт 16, 16:24 [19795538] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
я даже не знаю чьим советом вы воспользовались, но точно скажу вы можете серьёзно навредить компании в которой работаете, воспользуйтесь советом https://www.sql.ru/forum/job
Сообщение было отредактировано: 18 окт 16, 17:20 |
18 окт 16, 16:46 [19795662] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
ТАК ТУПО ВПИШИТЕ в мой запрос Ваши рекомендации и если сработает то ..... |
18 окт 16, 16:50 [19795689] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
Сообщение было отредактировано: 18 окт 16, 17:21 |
|
18 окт 16, 17:20 [19795866] Ответить | Цитировать Сообщить модератору |
alex.l.o Member Откуда: Сообщений: 28 |
TaPaK, СЛАБО, ДА ! |
18 окт 16, 17:57 [19796048] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |