Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2010, 20:10   #1
Novi4ok_11
Форумчанин
 
Регистрация: 11.12.2010
Сообщений: 110
По умолчанию SQL. Запрос.

Добрый день всем. Помогите пожалуйста с такой проблемой.
Вобщем есть две таблици в одной айди_водителя(primary key) его ФИО и стаж в другой Поездки id (primary key) айди_водителя(FK),дата поездки и количество километров.
Тоесть таблици такие:
Водители: id_vd(primary key),FIO,stg
Поездки: id(primary key), id_vd,date,kol_lt

Нужно написать запрос: вывести сумму километров которую проехал каждый водитель на определенных участках времени, запрос сам я написал вот он, работает отлично все выводит

Код:
SELECT FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101201' AND '20101207')
GROUP By FIO
Только мне нужно вывести 3 промежутка времени тоесть результат будит
такой(заголовки столбцов):
ФИО Промежуток1 Промежуток 2 Промежуток 3


Тоесть как бы выполнить отакие 3 запроса:
Код:
SELECT FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101201' AND '20101207')
GROUP By FIO
Код:
SELECT FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101208' AND '201012014')
GROUP By FIO
Код:
SELECT FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101215' AND '20101230')
GROUP By FIO
Как это сделать, помогите пожалуйста разобратся
Novi4ok_11 вне форума Ответить с цитированием
Старый 18.12.2010, 20:20   #2
rubius2008
Форумчанин
 
Регистрация: 19.03.2010
Сообщений: 409
По умолчанию

можешь выложить базу?
чтобы провериться
Есть вопросы, пишите в ЛС.
rubius2008 вне форума Ответить с цитированием
Старый 18.12.2010, 20:27   #3
Novi4ok_11
Форумчанин
 
Регистрация: 11.12.2010
Сообщений: 110
По умолчанию

Просто база у меня другая это я как пример сделал описание. Но я могу ее быстренько создать
Novi4ok_11 вне форума Ответить с цитированием
Старый 18.12.2010, 20:43   #4
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

почтай про UNION
пример (кликать тут)
vovk вне форума Ответить с цитированием
Старый 18.12.2010, 20:43   #5
Novi4ok_11
Форумчанин
 
Регистрация: 11.12.2010
Сообщений: 110
По умолчанию

http://rapidshare.com/files/438040228/dr.mdf
Вот залил на файлообменный хостинг, не нашол где прикреплять тут файлы можно
Novi4ok_11 вне форума Ответить с цитированием
Старый 18.12.2010, 20:44   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Novi4ok_11
это решаемая задача.
Только ты должен определиться, в каком виде тебе нужно получить результат..

поясню. если нужно получить:
01.12-07.12 Иванов 100
01.12-07.12 Петров 200
01.12-07.12 Сидоров 300
08.12-14.12 Сидоров 20
08.12-14.12 Петров 15
08.12-14.12 Козлевич 250
15.12-30.12 Иванов 500
....
то задача решается через элементарный UNION ALL:
Код:
SELECT '01.12-07.12' as TPeriod, FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101201' AND '20101207')
GROUP By FIO
UNION ALL
SELECT '08.12-14.12' as TPeriod, FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101208' AND '201012014')
GROUP By FIO
UNION ALL
SELECT '15.12-30.12' as TPeriod, FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101215' AND '20101230')
GROUP By FIO

если же нужно получить по водителю все ответы в одну строчку
Иванов 100 0 500
Сидоров 300 20 0
...
то указывайте одну и ту же таблицу Trav столько раз, сколько периодов (задавая разные псевдонимы) и связь c таблицей водителей DV делайте через LEFT JOIN


p.s. не разберёсь - пишите, вместе обязательно разберёмся...

удачи.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.12.2010, 20:47   #7
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

off
Цитата:
Сообщение от Novi4ok_11 Посмотреть сообщение
http://rapidshare.com/files/438040228/dr.mdf
Вот залил на файлообменный хостинг, не нашол где прикреплять тут файлы можно
можно, но только в расширеном режиме.
vovk вне форума Ответить с цитированием
Старый 18.12.2010, 20:49   #8
Novi4ok_11
Форумчанин
 
Регистрация: 11.12.2010
Сообщений: 110
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Novi4ok_11
это решаемая задача.
Только ты должен определиться, в каком виде тебе нужно получить результат..

поясню. если нужно получить:
01.12-07.12 Иванов 100
01.12-07.12 Петров 200
01.12-07.12 Сидоров 300
08.12-14.12 Сидоров 20
08.12-14.12 Петров 15
08.12-14.12 Козлевич 250
15.12-30.12 Иванов 500
....
то задача решается через элементарный UNION ALL:
Код:
SELECT '01.12-07.12' as TPeriod, FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101201' AND '20101207')
GROUP By FIO
UNION ALL
SELECT '08.12-14.12' as TPeriod, FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101208' AND '201012014')
GROUP By FIO
UNION ALL
SELECT '15.12-30.12' as TPeriod, FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101215' AND '20101230')
GROUP By FIO

если же нужно получить по водителю все ответы в одну строчку
Иванов 100 0 500
Сидоров 300 20 0
...
то указывайте одну и ту же таблицу Trav столько раз, сколько периодов (задавая разные псевдонимы) и связь c таблицей водителей DV делайте через LEFT JOIN


p.s. не разберёсь - пишите, вместе обязательно разберёмся...

удачи.
Да мне отак нужно как второй вариант, в одну строку по фамилии.

Я сделал отак, но вывело как вы написали первый вариант
Код:
USE dr
GO
SELECT FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_dv=tv.id_vd) AND (date BETWEEN '20101201' AND '20101202')
GROUP By FIO
UNION
(
SELECT FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_dv=tv.id_vd) AND (date BETWEEN '20101203' AND '20101205')
GROUP By FIO
)
Novi4ok_11 вне форума Ответить с цитированием
Старый 18.12.2010, 20:52   #9
Novi4ok_11
Форумчанин
 
Регистрация: 11.12.2010
Сообщений: 110
По умолчанию

Цитата:
то указывайте одну и ту же таблицу Trav столько раз, сколько периодов (задавая разные псевдонимы) и связь c таблицей водителей DV делайте через LEFT JOIN
А как это сделать я просто не знаю?
Novi4ok_11 вне форума Ответить с цитированием
Старый 18.12.2010, 21:14   #10
rubius2008
Форумчанин
 
Регистрация: 19.03.2010
Сообщений: 409
По умолчанию

попробуй так
Код:
select * from
(SELECT '01.12-07.12' as TPeriod, FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101201' AND '20101207')
GROUP By FIO) a

LEFT OUTER join

(SELECT '08.12-14.12' as TPeriod, FIO, SUM(kol_lt) FROM DRVS dv, Trav tv
WHERE (dv.id_vd=tv.id_vd) AND (date BETWEEN '20101208' AND '201012014')
GROUP By FIO) b
on a.fio=b.fio
Есть вопросы, пишите в ЛС.
rubius2008 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL запрос grafgrial Общие вопросы Delphi 8 19.10.2010 15:57
Запрос с CASE переделать в запрос с PIVOT (MS SQL Server 2005) Машуля SQL, базы данных 4 06.05.2010 21:09
SQL запрос Oleg Romanchuk Помощь студентам 2 23.11.2009 09:42
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15