Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 запрос  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
alex.l.o
если реально документов 10 а в справочники(ExchangeRates) строк 4, то документов SELECT 40
если вы хотите, чтобы их было 10 в итоге, то добавляйте в where условие однозначного и уникального выбора строки из ExchangeRates для каждого Document.IdCurrency
17 окт 16, 16:44    [19791392]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

Откуда:
Сообщений: 28
Уникального выбора нет только привязка к IdCurrency и Date
17 окт 16, 16:46    [19791399]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
alex.l.o
Уникального выбора нет только привязка к IdCurrency и Date
и где у вас в условиях Date?
17 окт 16, 16:48    [19791405]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

Откуда:
Сообщений: 28
ExchangeRates.Date <= Documtnt.Date это ничего не .... так как <= Date очень много.
17 окт 16, 16:51    [19791419]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
если
alex.l.o
Уникального выбора нет
то либо берите top(1) или аналог, либо идите к тому кто проектировал вашу БД с вопросом "как?"

предполагая, что это у вас некие документы и котировки на дату (только исходя из названий, могу ошибиться)
как у вас для одного документа и одной даты существует несколько котировок (или у вас там некие внутренние "типы рейтов")?
17 окт 16, 17:04    [19791498]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alex.l.o,

ExchangeRates.Date <= Documtnt.Date 

ДОБАВИЛ Document.Date>=ExchangeRates.Date

как это, вам всё равно? если курсы есть не на все даты, то по какому правилу определяются?
17 окт 16, 17:10    [19791535]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
TaPaK,

хотя о чём это я... вы просто местами переставляете и ожидаете другого результата?
17 окт 16, 17:14    [19791559]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

Откуда:
Сообщений: 28
что местами переставил ? я извиняюсь не понял.
17 окт 16, 17:24    [19791612]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

Откуда:
Сообщений: 28
вариант 2
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, 17:32
17 окт 16, 17:27    [19791623]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alex.l.o,

CROSS APPLY TOP 1 + ORDER BY или MIN/MAX в зависимости от того как условие на дату
17 окт 16, 17:32    [19791650]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

Откуда:
Сообщений: 28
спрашивает что такое GROSS ошибка

AND Document.Date GROSS APPLY (SELECT TOP 1 ExchangeRates.Date)
17 окт 16, 18:02    [19791822]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alex.l.o,

да ну нафик.... http://www.sql-tutorial.ru/ru/book_cross_apply.html
17 окт 16, 18:03    [19791826]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

Откуда:
Сообщений: 28
SELECT TOP 1 выдаст первою запись в справочнике ExchangeRates (какой курс ), а изменить, что либо в решении задачи

TOP не поможет.
17 окт 16, 19:14    [19792092]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alex.l.o
SELECT TOP 1 выдаст первою запись в справочнике ExchangeRates (какой курс ), а изменить, что либо в решении задачи

TOP не поможет.

какую проблему это не решит?
18 окт 16, 08:50    [19793023]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

Откуда:
Сообщений: 28
А куда девать 40 документов
18 окт 16, 15:15    [19795117]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
alex.l.o,

имхо, вам сюда
18 окт 16, 15:30    [19795212]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

Откуда:
Сообщений: 28
Дедушка,

Чем куда то посылать лучше помогли бы. Есть запрос впишите Ваш ТОР, если получится я буду Вам очень благодарен.

У меня не получается потому что в справочник не каждый день заносится курс валют и Currency(доллар - рубль) повторяется очень

часто. Потому уникального одного варианта достичь невозможно ТОР (1).
18 окт 16, 16:09    [19795476]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
Дедушка
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]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
я даже не знаю чьим советом вы воспользовались, но точно скажу вы можете серьёзно навредить компании в которой работаете, воспользуйтесь советом https://www.sql.ru/forum/job

Сообщение было отредактировано: 18 окт 16, 17:20
18 окт 16, 16:46    [19795662]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

Откуда:
Сообщений: 28
ТАК ТУПО ВПИШИТЕ в мой запрос Ваши рекомендации и если сработает то .....
18 окт 16, 16:50    [19795689]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37139
Модератор: Как и обещал, буду ТУПО СТИРАТЬ ваши криво отформатированные запросы.


Сообщение было отредактировано: 18 окт 16, 17:21
18 окт 16, 17:20    [19795866]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
alex.l.o
Member

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

СЛАБО, ДА !
18 окт 16, 17:57    [19796048]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить