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

Откуда:
Сообщений: 56
Здравствуйте!
Пожалуйста помогите составить запрос для MS SQL.
По-русски, это должно выглядеть так:

В базе "db1" получить из таблицы "tbl01" все строки с:
  • значением даты в поле "data_d" больше '2015-03-01' И
  • значением поля "kozel" равным '0' И
  • если значение в поле "dogovor" присутствует в таблице "tbl02" и в ней:
    - значение в поле "oplata" больше '0' И
    - дата в поле "dataplat" больше '2015-01-01',
    + отсортировать результат по возрастанию по полю "data_d"

    По понятным причинам реальные данные заменяю на наглядные:
    tbl01
    id dogovor kozel data_d ...
    1 ivan23 0 2015-03-02 ...
    2 petr11 0 2015-02-12 ...
    3 semen62 1 2015-03-10 ...
    4 anna10 0 2012-05-06 ...
    5 misha33 0 2015-02-02 ...
    6 abram66 0 2013-02-27 ...
    7 iliya30 0 2015-03-08 ...
    8 vik87 0 2011-09-11 ...

    tbl02
    id dogovor ... oplata dataplat
    1 petr11 ... 100 2015-02-12
    2 ivan23 ... 8 2015-01-14
    3 serg22 ... 75 2013-12-30
    4 mihas33 ... 55 2015-01-14
    5 dima55 ... 0 1970-01-01
    6 iliya30 ... 14 2015-03-09
    7 masha44 ... 0 1970-01-01
    8 semen62 ... 777 2014-07-10

    Т.е. в моем примере должны вернуться записи с "id" = 1 ('ivan23') и "id" = 7 ('iliya30')

    Такая попытка написать запрос вызывает ошибку
    SELECT [id],[dogovor],[kozel], ...
    	FROM [db1].[dbo].[tbl01],[db1].[dbo].[tbl02] 
    	WHERE [tbl01.dogovor] <> "" AND 
    		[tbl01.data_d] > '2015-03-01' AND 
    		[tbl01.kozel] = '0' AND 
    		([tbl02.dogovor] = [tbl01.dogovor] AND 
    			[tbl02.oplata] > 0 AND 
    			[tbl02.dataplat] > '2015-01-01') 
    	ORDER BY [tbl01.data_d] ASC;
    


    Заранее спасибо за помощь!
  • 1 мар 15, 21:16    [17329228]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    and exists
    Guest
    select * from tbl01
    -- значением даты в поле "data_d" больше '2015-03-01' И
    where data_d>'20150301'
    -- значением поля "kozel" равным '0' И
    and kozel=0
    -- если значение в поле "dogovor" присутствует в таблице "tbl02" и в ней:
    -- - значение в поле "oplata" больше '0' И
    -- - дата в поле "dataplat" больше '2015-01-01',
    and exists (select 1 from tb02 where tbl02.dogovor = tbl01.dogovor and tbl02.oplata>0 and tbl02.dataplat>'20150101')
    -- + отсортировать результат по возрастанию по полю "data_d"
    order by data_d
    
    1 мар 15, 22:05    [17329379]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    pinkrose
    Member

    Откуда:
    Сообщений: 56
    and exists,

    Что-то не работает Ваш запрос...
    Посмотрела, нужных записей много, но возвращается пустой результат.
    2 мар 15, 17:18    [17333218]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    PaulYoung
    Member

    Откуда: Москва
    Сообщений: 2567
    pinkrose,

    вы чего-то недоговариваете... Кстати, рекомендации тут читали?
    2 мар 15, 17:23    [17333262]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    QWERTY!
    Guest
    pinkrose,

    В базе "db1" получить из таблицы "tbl01" все строки с:
    •значением даты в поле "data_d" больше '2015-03-01' И

    •значением поля "kozel" равным '0' И

    •если значение в поле "dogovor" присутствует в таблице "tbl02" и в ней:
    - значение в поле "oplata" больше '0' И
    - дата в поле "dataplat" больше '2015-01-01',
    + отсортировать результат по возрастанию по полю "data_d"

    ------------------> КАК СТАВИЛИ ПОСТАНОВКУ ЗАДАЧИ ТАК И ПОЛУЧИЛИ РЕШЕНИЕ
    Что значит Если? Это условие для сортировки? тогда где вторая ветвь условия т.е. иначе?
    2 мар 15, 17:31    [17333324]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    pinkrose
    Member

    Откуда:
    Сообщений: 56
    PaulYoung,
    Конечно, я не могу все говорить, т.к. реальные данные из базы, это коммерческая тайна. Как говорит наш начальник безопасности, "тех, кто способствует утечке информации обычно настигает случайная сосулька с крыши или случайно падает лифт".

    А что именно я нарушила из правил?

    QWERTY!,
    Наверно задача не очень четко была сформулирована.
    QWERTY!
    ------------------> КАК СТАВИЛИ ПОСТАНОВКУ ЗАДАЧИ ТАК И ПОЛУЧИЛИ РЕШЕНИЕ
    Что значит Если? Это условие для сортировки? тогда где вторая ветвь условия т.е. иначе?

    "Если" относится не к сортировке, а к выполнению условий, а сортировка применяется ко всему результату.

    Сейчас при выполнении запроса в MSMSE получаю ошибку:
    Сообщение 8115, уровень 16, состояние 2, строка 2
    Arithmetic overflow error converting expression to data type datetime.
    

    А если запрос из программы, то просто получаю пустой результат.
    2 мар 15, 17:57    [17333541]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    QWERTY!
    Guest
    автор
    А если запрос из программы, то просто получаю пустой результат.


    скорее всего потому что Ваша программа не обрабатывает ошибки.

    автор
    Сообщение 8115, уровень 16, состояние 2, строка 2
    Arithmetic overflow error converting expression to data type datetime.

    Укажите дату в нормальном формате для Вашего сервера.

    Пробуйте!
    2 мар 15, 18:03    [17333584]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    yyyymmdd
    Guest
    QWERTY!
    Укажите дату в нормальном формате для Вашего сервера.
    вроде как формат yyyymmdd (как здесь 17329379) - универсальный, и понятен при любом виде системной даты, не ?
    2 мар 15, 19:59    [17334156]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    PaulYoung
    Member

    Откуда: Москва
    Сообщений: 2567
    pinkrose,

    всего-то и нужно предоставить здесь пример тестовых данных и желаемый результат, о чём и написано в рекомендациях к оформлению сообщений на форуме. А гадать о том, что же, собственно, вам нужно, можно долго и упорно, вместо того, чтобы сделать всё хорошо. Так пожалейте же своё и наше время.
    3 мар 15, 10:22    [17335674]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    pinkrose
    Member

    Откуда:
    Сообщений: 56
    Почему то MS SQL-сервер не понимает формат даты без дефисов-разделителей, выдает ошибку.
    Добавила дефисы ('2015-03-01' вместо '20150301') и все волшебно заработало!
    9 мар 15, 19:34    [17361173]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31983
    pinkrose
    Почему то MS SQL-сервер не понимает формат даты без дефисов-разделителей, выдает ошибку.
    Добавила дефисы ('2015-03-01' вместо '20150301') и все волшебно заработало!
    Странно. И какая ошибка, "не понимаю формат даты"?
    9 мар 15, 20:28    [17361394]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47144
    pinkrose
    Почему то MS SQL-сервер не понимает формат даты без дефисов-разделителей, выдает ошибку.
    Добавила дефисы ('2015-03-01' вместо '20150301') и все волшебно заработало!
    Для DATETIME строка '2015-03-13' даст неожиданный для Вас результат:
    SET DATEFORMAT YDM;
    SELECT CAST('2015-03-13' AS DATETIME);
    
    А всё потому, что 13-го месяца не бывает.
    Иначе говоря, "волшебные" строки неоднозначно преобразуются в DATETIME (но не в DATE!)
    9 мар 15, 20:57    [17361520]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    pinkrose
    Member

    Откуда:
    Сообщений: 56
    alexeyvg
    pinkrose
    Почему то MS SQL-сервер не понимает формат даты без дефисов-разделителей, выдает ошибку.
    Добавила дефисы ('2015-03-01' вместо '20150301') и все волшебно заработало!
    Странно. И какая ошибка, "не понимаю формат даты"?

    Уже писала, что ошибка
    автор
    Arithmetic overflow error converting expression to data type datetime.

    Как поставила дефисы, запрос заработал и вернул нужные записи.
    9 мар 15, 22:41    [17361895]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47144
    pinkrose
    Уже писала, что ошибка
    автор
    Arithmetic overflow error converting expression to data type datetime.
    Как поставила дефисы, запрос заработал и вернул нужные записи.
    Сказки рассказываете.
    Может, апострофы не поставили, получилось число 20150301 (а не строка!),
    которое пыталось конвертироваться в дату типа 74000-й год или что-то вроде этого
    10 мар 15, 09:58    [17362895]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    iap
    Member

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

    кстати, если к 1 января 1900 года прибавить 20150301 день, то какая точно дата должна была бы получиться?
    Это я так просто спрашиваю, чтобы разговор поддержать
    10 мар 15, 10:01    [17362913]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31983
    pinkrose
    alexeyvg
    пропущено...
    Странно. И какая ошибка, "не понимаю формат даты"?

    Уже писала, что ошибка
    автор
    Arithmetic overflow error converting expression to data type datetime.

    Как поставила дефисы, запрос заработал и вернул нужные записи.
    Да, согласен с iap, не было кавычек, ошибка об этом прямо кричит.
    10 мар 15, 10:55    [17363248]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47144
    alexeyvg
    pinkrose
    пропущено...

    Уже писала, что ошибка
    пропущено...

    Как поставила дефисы, запрос заработал и вернул нужные записи.
    Да, согласен с iap, не было кавычек, ошибка об этом прямо кричит.
    Кстати, по моим расчётам 1 января 1900 года плюс 20150301 день - это 26 августа 57069 года
    Что-то мне подсказывает, что мы не доживём.
    10 мар 15, 11:00    [17363278]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    o-o
    Guest
    pinkrose
    Как поставила дефисы, запрос заработал и вернул нужные записи.

    надо сначала выяснить, что имеется в виду под апострофами, что под дефисами, и как ныне модно называть двойные кавычки.
    читаем внимательно первый пост:
    pinkrose
    Такая попытка написать запрос вызывает ошибку
    SELECT [id],[dogovor],[kozel], ...
    	FROM [db1].[dbo].[tbl01],[db1].[dbo].[tbl02] 
    	WHERE [tbl01.dogovor] <> "" AND 
    		[tbl01.data_d] > '2015-03-01' AND 
    		[tbl01.kozel] = '0' AND 
    		([tbl02.dogovor] = [tbl01.dogovor] AND 
    			[tbl02.oplata] > 0 AND 
    			[tbl02.dataplat] > '2015-01-01') 
    	ORDER BY [tbl01.data_d] ASC;
    


    т.е. вызывает ошибку как раз "с дефисами"?
    нееее, не все так просто!
    данный кусок кода валится на вот этом:
    WHERE [tbl01.dogovor] <> "" AND 
    

    выходит, "дефисы" это двойные кавычки

    короче, здесь все дело в терминологии.
    надо в каждом посте вновь прибывших вводить мини-словарь
    с истолкованием современной терминологии
    10 мар 15, 11:36    [17363536]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с составлением запроса из двух таблиц  [new]
    WarAnt
    Member

    Откуда: Питер
    Сообщений: 2423
    o-o
    надо в каждом посте вновь прибывших вводить мини-словарь
    с истолкованием современной терминологии


    Не стоит, мы так свалимся в банальное разжевывание, всякого рода домохозяйкам возомнившим себя ДВА, что такое сиквел.))
    Пусть учат матчасть по справочникам и книгам.
    10 мар 15, 12:22    [17363903]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить