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

Откуда:
Сообщений: 47
Две таблицы:
-период (ID, название)
-курсы валют (ID, период, курс)

Можно ли создать представление (выборку) из данных таблиц, кот. даже при отсутствии курса на определенный период, выведет определенное значение? Т.е. в таблице "Период" значения 12 мес. 2012года, а в таблице "Курсы валют" курсы валют только на Январь. Необходимо, чтобы в итоговой выборке появился список курсов валют всех месяцев, с курсом за январь из таблицы "Курсы валют" (т.к. он существует) и каким-либо значений для других месяцев (т.к. курсы валют за др.месяцы отсутствуют в таблице "Курсы валют")
10 апр 12, 15:22    [12394186]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Какое ясное описание задачи!

Обычно при отсутствии курса за какой-нибудь день берут последнее по времени заданное в таблице.
С помощью конструкции
SELECT TOP(1) T.Rate FROM T WHERE T.CurrencyID =... AND T.[Date]<=... ORDER BY [Date] DESC
где вместо многоточий - соответствующие поля внешнего запроса.
10 апр 12, 15:29    [12394254]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
Glory
Member

Откуда:
Сообщений: 104751
HG_87
Необходимо, чтобы в итоговой выборке появился список курсов валют всех месяцев, с курсом за январь из таблицы "Курсы валют" (т.к. он существует) и каким-либо значений для других месяцев (т.к. курсы валют за др.месяцы отсутствуют в таблице "Курсы валют")

А вот если есть курс для Января и для Марта, то что должно быть выбрано для отсутствующего Февраля ?
10 апр 12, 15:32    [12394275]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
HG_87
Member

Откуда:
Сообщений: 47
Glory, при отсутствии курса для какой-либо валюты в таблице "Курсы валют" будет выводится какое-либо значение (например 30 для доллара).

P.S. Нашел в интернете что-то вроде левого и правого связывания. Может это?
10 апр 12, 15:44    [12394353]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
Glory
Member

Откуда:
Сообщений: 104751
HG_87
Glory, при отсутствии курса для какой-либо валюты в таблице "Курсы валют" будет выводится какое-либо значение (например 30 для доллара).

Случайное что ли ?
10 апр 12, 15:45    [12394358]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
HG_87
при отсутствии курса для какой-либо валюты в таблице "Курсы валют" будет выводится какое-либо значение (например 30 для доллара).
Лучше рупь восемьдесят!
10 апр 12, 15:46    [12394363]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
HG_87
Member

Откуда:
Сообщений: 47
Glory, не случайно. Для каждой валюты будет такое значение. Своего рода значение по умолчанию.
10 апр 12, 15:54    [12394422]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
Glory
Member

Откуда:
Сообщений: 104751
HG_87
Glory, не случайно. Для каждой валюты будет такое значение. Своего рода значение по умолчанию.

В чем тогда проблема то ?
OUTER JOIN и ISNULL()
10 апр 12, 15:56    [12394445]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
HG_87
Glory, не случайно. Для каждой валюты будет такое значение. Своего рода значение по умолчанию.
А ну как рубль резко упадёт?
Или наоборот...
10 апр 12, 16:00    [12394468]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
HG_87
Member

Откуда:
Сообщений: 47
Glory, запрос таков:

SELECT dbo.Period.Name, ISNULL(dbo.Currency_rates.Rate, 35) AS Expr1, dbo.Currency_rates.Version, dbo.Currency.Name AS Currency
FROM dbo.Currency_rates LEFT OUTER JOIN
dbo.Period ON dbo.Currency_rates.Period = dbo.Period.ID INNER JOIN
dbo.Currency ON dbo.Currency_rates.Currency = dbo.Currency.ID
WHERE (dbo.Currency_rates.Version = 2)

Результат:

Period Rate Ver Cur

Bef 11 30 2 USD
Bef 11 40 2 EUR
Jan 11 32 2 USD
Jan 11 42 2 EUR

Т.е. опять же выводится только то что есть в табл. "Курсы валют"!
10 апр 12, 16:02    [12394486]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
Glory
Member

Откуда:
Сообщений: 104751
HG_87
Т.е. опять же выводится только то что есть в табл. "Курсы валют"!

Ну так если вам нужны _все_ периоды, то почему таблица с периодами стомит справа ?
10 апр 12, 16:04    [12394500]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
HG_87
Member

Откуда:
Сообщений: 47
Glory, т.е. так:

SELECT dbo.Period.Name, ISNULL(dbo.Currency_rates.Rate, 35) AS Expr1, dbo.Currency_rates.Version, dbo.Currency.Name AS Currency
FROM dbo.Period LEFT OUTER JOIN
dbo.Currency_rates ON dbo.Period.ID = dbo.Currency_rates.Period INNER JOIN
dbo.Currency ON dbo.Currency_rates.Currency = dbo.Currency.ID
WHERE (dbo.Currency_rates.Version = 2)
10 апр 12, 16:08    [12394532]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Glory
HG_87
Т.е. опять же выводится только то что есть в табл. "Курсы валют"!

Ну так если вам нужны _все_ периоды, то почему таблица с периодами стомит справа ?
Тогда уж и из WHERE условие перенести надо
10 апр 12, 16:09    [12394536]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
HG_87
Glory, т.е. так:

SELECT dbo.Period.Name, ISNULL(dbo.Currency_rates.Rate, 35) AS Expr1, dbo.Currency_rates.Version, dbo.Currency.Name AS Currency
FROM dbo.Period LEFT OUTER JOIN
dbo.Currency_rates ON dbo.Period.ID = dbo.Currency_rates.Period INNER JOIN
dbo.Currency ON dbo.Currency_rates.Currency = dbo.Currency.ID
WHERE (dbo.Currency_rates.Version = 2)
SELECT P.Name, ISNULL(R.Rate,35) Expr1, R.Version, C.Name Currency
FROM dbo.Period P
LEFT JOIN
        dbo.Currency_rates R
 JOIN dbo.Currency C ON C.Version = 2 AND R.Currency = C.ID
ON P.ID = C.Period;
10 апр 12, 16:13    [12394578]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
HG_87
Member

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

Выводит не совсем то. Во-первых существующие курсы не соответствуют, во-вторых Null в Version и Currency

Bef 11 35 NULL NULL
Jan 11 30 2 USD
Jan 11 32 2 USD
Feb 11 40 2 EUR
Feb 11 42 2 EUR
Mar 11 35 NULL NULL
Apr 11 35 NULL NULL
May 11 35 NULL NULL
Jun 11 35 NULL NULL
Jul 11 35 NULL NULL
Aug 11 35 NULL NULL
Sep 11 35 NULL NULL
Oct 11 35 NULL NULL
Nov 11 35 NULL NULL
Dec 11 35 NULL NULL
10 апр 12, 16:35    [12394777]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
Glory
Member

Откуда:
Сообщений: 104751
HG_87
во-вторых Null в Version и Currency

Вы же уверяли, что где-то какие-то "Своего рода значение по умолчанию. " имеются

HG_87
Во-первых существующие курсы не соответствуют

Потому что отсутствует условие dbo.Period.ID = dbo.Currency_rates.Period
10 апр 12, 16:39    [12394822]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
HG_87
Member

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

Точнее так.

Bef 11 30 2 USD
Bef 11 40 2 EUR
Jan 11 32 2 USD
Jan 11 42 2 EUR
Feb 11 35 NULL NULL
Mar 11 35 NULL NULL
Apr 11 35 NULL NULL
May 11 35 NULL NULL
Jun 11 35 NULL NULL
Jul 11 35 NULL NULL
Aug 11 35 NULL NULL
Sep 11 35 NULL NULL
Oct 11 35 NULL NULL
Nov 11 35 NULL NULL
Dec 11 35 NULL NULL
10 апр 12, 16:45    [12394877]     Ответить | Цитировать Сообщить модератору
 Re: Выборка при отсутствии значений в одной из таблиц.  [new]
HG_87
Member

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

Можно сделать так:

SELECT P.Name, ISNULL(R.Rate, 35) AS Rate, C.Name AS Currency
FROM dbo.Period AS P LEFT OUTER JOIN
dbo.Currency_rates AS R INNER JOIN
dbo.Currency AS C ON R.Version = 2 AND R.Currency = C.ID ON P.ID = R.Period
WHERE (C.Name = N'USD') OR
(C.Name IS NULL)

И получить:

Bef 11 30 USD
Jan 11 32 USD
Feb 11 35 NULL
Mar 11 35 NULL
Apr 11 35 NULL
May 11 35 NULL
Jun 11 35 NULL
Jul 11 35 NULL
Aug 11 35 NULL
Sep 11 35 NULL
Oct 11 35 NULL
Nov 11 35 NULL
Dec 11 35 NULL

Т.е. желаемый список курсов, но одной валюты.

Спасибо большое всем за участие.
10 апр 12, 17:09    [12395078]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить