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

Откуда:
Сообщений: 2
Здравствуйте! Не могу вот такое сообразить:

есть несколько чп, у каждого чп может быть много договоров, а у договора признак оплаты. Меня интересуют тока договоры с номерами 22 и 33

чп договор оплата
100 22 1
100 33 1


нужно извлечь всех чп у которых стоит оплата и по 22 договору и по 33
17 июн 09, 11:31    [7309061]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
1) Использовать EXISTS подзапрос
2) Использовать GROUP BY+ HAVING
17 июн 09, 11:36    [7309102]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
WHERE EXISTS(SELECT * FROM ... WHERE договор=22 AND оплата=1)
  AND EXISTS(SELECT * FROM ... WHERE договор=33 AND оплата=1)
??
17 июн 09, 11:36    [7309107]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
iljy
Guest
Жжжжжж,

      select [чп], sum(case when [договор] = 22 then [оплата] else 0 end) d22
              sum(case when [договор] = 33 then [оплата] else 0 end) d33
      from Table
      group by [чп]
      having d22 = 1 and d33 = 1
17 июн 09, 11:37    [7309115]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
WHERE EXISTS(SELECT * FROM ... WHERE договор=22 AND оплата=1)
  AND EXISTS(SELECT * FROM ... WHERE договор=33 AND оплата=1)
??
Ну, ещё с основным запросом по чп связать, конечно...
17 июн 09, 11:38    [7309118]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
Можно ещё извращенным способом прикрутить оконные функции
17 июн 09, 11:38    [7309125]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
Жжжжжж,

      select [чп], sum(case when [договор] = 22 then [оплата] else 0 end) d22
              sum(case when [договор] = 33 then [оплата] else 0 end) d33
      from Table
      group by [чп]
      having d22 = 1 and d33 = 1
Тогда можно и так
      select [чп]
      from Table
      where [оплата]=1 and [договор] in (22,33)
      group by [чп]
      having count(distinct [договор])=2;
17 июн 09, 11:41    [7309145]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
iljy
Жжжжжж,

      select [чп], sum(case when [договор] = 22 then [оплата] else 0 end) d22
              sum(case when [договор] = 33 then [оплата] else 0 end) d33
      from Table
      group by [чп]
      having d22 = 1 and d33 = 1
А чtuj так сложно-то???
Всё гораздо проще:
      select [чп]
      from Table
 where [договор] = any(22,23)
      group by [чп]
      having count(distinct [договор]) = 2
17 июн 09, 11:41    [7309152]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Бабичев Сергей,

А я раньше на кнопку нажал!
17 июн 09, 11:44    [7309180]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
iljy
Guest
iap,

можно и так, я просто обычный запрос типа PIVOT взял и переделал чтоб долго не думать:) я думаю планы будут почти одинаковые. и кстати - не очень понятно зачем count(distinct...), врядли там записи могут повторяться.


Бабичев Сергей,
в погоне за простотой забыли о смысле;) where [оплата]=1
17 июн 09, 11:46    [7309198]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
iljy
Бабичев Сергей,
в погоне за простотой забыли о смысле;) where [оплата]=1
Если автор и этого условия не сможет прикрутить в свой запрос, то что ему вообще тут делать?
17 июн 09, 11:47    [7309211]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
просто так...
Guest
может что-то типа того:

select distinct [чп] from dbo.[оплата_договоров] where
([договор] =22 and [оплата]=1)
and
([договор] =33 and [оплата]=1)
17 июн 09, 11:48    [7309213]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
iap
Бабичев Сергей,

А я раньше на кнопку нажал!
Ну, куда мне старому и ленивому тягаться с молодежью в скорости нажатия на кнопки... ;)
17 июн 09, 11:50    [7309225]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
просто так...
может что-то типа того:

select distinct [чп] from dbo.[оплата_договоров] where
([договор] =22 and [оплата]=1)
and
([договор] =33 and [оплата]=1)
Такой запрос никогда ничего не вернет, так как одна и та же запись в таблице никогда не сможет быть одновременно равной 22 и 23. Учи булеву алгебру и матлогику...
17 июн 09, 11:51    [7309238]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
просто так...
Guest
елы -палы ,как я попал ! :)
Вы совершенно правы.
17 июн 09, 11:55    [7309263]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
iljy
Guest
Бабичев Сергей
iljy
Бабичев Сергей,
в погоне за простотой забыли о смысле;) where [оплата]=1
Если автор и этого условия не сможет прикрутить в свой запрос, то что ему вообще тут делать?


я ж не спорю, я так
17 июн 09, 11:58    [7309281]     Ответить | Цитировать Сообщить модератору
 Re: сравнение записей  [new]
Жжжжжж
Member

Откуда:
Сообщений: 2
Ребята! Огромное спасибо :)
17 июн 09, 12:21    [7309501]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить