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

Откуда:
Сообщений: 4
Сложная структура таблиц, а я еще новичок. Нет возможности быстро и глубоко изучить SQL - изучаю в процессе работы, просьба не ругаться.

Структура следующая:
Главная таблица с тарифами Tariffs содержит названия тарифов и всевозможные наценки. Фиксированная стоимость тарифа, тоже оформлена как наценка.Нас будут интересовать наценки: по времени(TariffsExtraTime), по пробегу (TariffsExtraRun) и Фиксированная сумма по тарифу (TariffsExtraFix)

Наценки эти добавляются отдельной записью в таблицу Tariffs и между собой пересекаются только по названию тарифа.

Нужно написать запрос выводящий подробную информацию по тарифам, со всеми наценками.

Я написал для фиксированной стоимости тарифа, и для наценки по времени, теперь хочу их объединить, как это правильно сделать?


/****** Вывод Фикса  ******/
SELECT     Tariffs.Name AS [Название тарифа], TariffsExtraFix.Money AS Фикс
FROM         Tariffs INNER JOIN
                      TariffsInExtra ON Tariffs.ID = TariffsInExtra.Tariffs_ID INNER JOIN
                      TariffsExtraFix ON TariffsInExtra.TariffsExtraFix_ID = TariffsExtraFix.ID
WHERE     (Tariffs.is_active = 1)

 /****** Вывод Надбавки по времени  ******/                     
                   
SELECT     Tariffs.Name AS [Название тарифа], TariffsInExtra.Name AS [Название наценки], TariffsExtraTime.Money AS [Надбавка по времени руб.], CONVERT(Varchar(20), 
                      TariffsInExtra.TimeStart, 8) AS [Начало действия чч:мм], CONVERT(Varchar(20), TariffsInExtra.TimeEnd, 8) AS [Окончание действия чч:мм], 
                      TariffsExtraTime.MinuteStart AS [Начало действия с мин.], TariffsExtraTime.MinuteLen AS [Продолжительность действия мин.]
FROM         Tariffs INNER JOIN
                      TariffsInExtra ON Tariffs.ID = TariffsInExtra.Tariffs_ID INNER JOIN
                      TariffsExtraTime ON TariffsInExtra.TariffsExtraTime_ID = TariffsExtraTime.ID
WHERE     (Tariffs.is_active = 1)
ORDER BY [Название тарифа]
25 дек 12, 15:02    [13683372]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Aleksey V.P.
Member

Откуда: Москва
Сообщений: 575
Климов Павел,

union, order by или всё в одной строке?
25 дек 12, 15:32    [13683717]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Климов Павел,

У вас запросы возвращают разное число столбцов. Поэтому не совсем ясно, как именно вы их хотите объединить. Приведите пример, как оно должно выглядеть.
25 дек 12, 15:55    [13683959]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Климов Павел
Member

Откуда:
Сообщений: 4
Первый запрос возвращает мне Название тарифа и фиксированную сумму:

автор
Название тарифа; Фикс;
Базовый VIP;120000
Базовый будни;49500
Базовый будни;49500
Базовый будни ЖК;49500
Базовый будни ЖК;49500
Базовый выходные;49500
Базовый выходные ЖК;49500
Базовый Поездка за МКАД VIP;240000
Базовый Стд;59500
Базовый Стд К;49500
Базовый Стд+;69500
Базовый Стд+ К;49500


Второй запрос возвращает мне надбавку по времени:

автор
Название тарифа; Название наценки; Надбавка по времени руб. ;Начало действия чч:мм; Окончание действия чч:мм; Начало действия с мин.; Продолжительность действия мин.
Базовый будни;Свыше минималки ночь;2500;21:00:00;06:59:00;20;3600
Базовый будни;Свыше минималки день;2500;07:00:00;20:59:00;20;3600
Базовый будни;Ожидание;2500;00:00:00;23:59:00;10;3600
Базовый будни ЖК;Свыше минималки день (копия);2500;07:00:00;20:59:00;20;3600
Базовый будни ЖК;Ожидание (копия);2500;00:00:00;23:59:00;10;3600
Базовый будни ЖК;Свыше минималки ночь (копия);2500;21:00:00;06:59:00;20;3600
Базовый выходные;Свыше минималки;2500;00:00:00;23:59:00;20;3600
Базовый выходные;Ожидание (копия);2500;00:00:00;23:59:00;10;3600
Базовый выходные ЖК;Свыше минималки (копия);2500;00:00:00;23:59:00;20;3600
Базовый выходные ЖК;Ожидание (копия) (копия);2500;00:00:00;23:59:00;10;3600
Базовый Поездка за МКАД VIP;Свыше минималки в Мск;2500;00:00:00;23:59:00;60;3600
Базовый Поездка за МКАД VIP;Ожидание (копия);2000;00:00:00;23:59:00;10;3600
Базовый Стд;Свыше минималки;2000;00:00:00;23:59:00;20;3600
Базовый Стд;Ожидание;1000;00:00:00;23:59:00;10;3600
Базовый Стд К;Свыше минималки;1500;00:00:00;23:59:00;30;3600
Базовый Стд К;Ожидание;1500;00:00:00;23:59:00;10;3600
Базовый Стд+;Свыше минималки;2000;00:00:00;23:59:00;20;3600
Базовый Стд+;Ожидание;1000;00:00:00;23:59:00;10;3600
Базовый Стд+ К;Свыше минималки;2000;00:00:00;23:59:00;25;3600
Базовый Стд+ К;Ожидание;1500;00:00:00;23:59:00;10;3600


Я хочу чтобы во втором запросе был столбец с фиксированной суммой соответственно названию тарифа
25 дек 12, 16:13    [13684148]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Климов Павел,

Если я правильно понял условие, то примерно так

SELECT    Tariffs.Name AS [Название тарифа], TariffsExtraFix.Money AS Фикс,
          TariffsInExtra.Name AS [Название наценки], TariffsExtraTime.Money AS [Надбавка по времени руб.],
          CONVERT(Varchar(20), TariffsInExtra.TimeStart, 8) AS [Начало действия чч:мм],
          CONVERT(Varchar(20), TariffsInExtra.TimeEnd, 8) AS [Окончание действия чч:мм], 
          TariffsExtraTime.MinuteStart AS [Начало действия с мин.],
          TariffsExtraTime.MinuteLen AS [Продолжительность действия мин.]
FROM         Tariffs INNER JOIN
                      TariffsInExtra ON Tariffs.ID = TariffsInExtra.Tariffs_ID INNER JOIN
                      TariffsExtraTime ON TariffsInExtra.TariffsExtraTime_ID = TariffsExtraTime.ID INNER JOIN
                      TariffsExtraFix ON TariffsInExtra.TariffsExtraFix_ID = TariffsExtraFix.ID
WHERE     (Tariffs.is_active = 1)
ORDER BY [Название тарифа]


И используйте алиасы таблиц, будет легче читать/писать запросы.
25 дек 12, 16:25    [13684229]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Климов Павел
Member

Откуда:
Сообщений: 4
Дело в том что такой запрос выводит 0 строк, так как нет таких строк в которых одновременно есть ID ведущей к таблице с наценкой по времени и ID ведущей к фиксированной стоимости тарифа...

вот содержание таблицы TariffsInExtra, тут это видно

<a href='http://imglink.ru/show-image.php?id=bb6ed433639dc0210ff0b23d692aa02f'> <img src='http://imglink.ru/thumbnails/25-12-12/9a8afb6b7e744ec016d5da6638197ad8.jpg' border='0'> </a>
25 дек 12, 16:51    [13684440]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Климов Павел,

Ну тогда как-то так
SELECT    t.Name AS [Название тарифа], fix.Money AS Фикс,
          tie2.Name AS [Название наценки], time.Money AS [Надбавка по времени руб.],
          CONVERT(Varchar(20), tie2.TimeStart, 8) AS [Начало действия чч:мм],
          CONVERT(Varchar(20), tie2.TimeEnd, 8) AS [Окончание действия чч:мм], 
          time.MinuteStart AS [Начало действия с мин.],
          time.MinuteLen AS [Продолжительность действия мин.]
FROM      Tariffs t
          INNER JOIN TariffsInExtra tie1 ON t.ID = tie1.Tariffs_ID
          INNER JOIN TariffsExtraFix fix ON tie1.TariffsExtraFix_ID = fix.ID
          INNER JOIN TariffsInExtra tie2 ON t.ID = tie2.Tariffs_ID
          INNER JOIN TariffsExtraTime time ON tie2.TariffsExtraTime_ID = time.ID INNER JOIN
WHERE     (t.is_active = 1)
ORDER BY [Название тарифа]
25 дек 12, 17:14    [13684599]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Климов Павел
Member

Откуда:
Сообщений: 4
Да. Супер, то что нужно, спасибо ;) Не знал что так можно делать -))
25 дек 12, 18:15    [13685014]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить