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

Откуда:
Сообщений: 29
Существует базы клиентских карт. По картам может производится начисление и списание баллов. Необходимо выбрать карты по которым производилось только списание, только начисление, или обе операции.

Card
ID, CardNumber
11111111, 111
11111112, 112
11111113, 113
11111114, 114

Operations
CardID,OperationTypeID,Points
11111111, 1, 10
11111111, 1, 45
11111111, 1, 40
11111112, 2, 30
11111112, 1, 25
11111113, 2, 30
11111114, 1, 50
11111114, 2, 60
11111114, 2, 45
11111114, 1, 40

Подскажите по какой логике должен работать скрипт (без курсоров).
23 ноя 11, 11:51    [11643033]     Ответить | Цитировать Сообщить модератору
 Re: Клиентские карты  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
select CardID
      ,sum(case when OperationTypeID = 1 then 1 else 0 end) as OperationTypeID_1
      ,sum(case when OperationTypeID = 2 then 2 else 0 end) as OperationTypeID_2
  from Operations
 group by CardID
тестируйте...
23 ноя 11, 11:58    [11643124]     Ответить | Цитировать Сообщить модератору
 Re: Клиентские карты  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
fduch11,

по логике, выбираете из таблицы Card карты, а в связанном подзапросе к таблице Operations в where фильтруете только те что вам нужны при помощи операторов exists / not exists.
23 ноя 11, 11:59    [11643142]     Ответить | Цитировать Сообщить модератору
 Re: Клиентские карты  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Паганель
select CardID
      ,sum(case when OperationTypeID = 1 then 1 else 0 end) as OperationTypeID_1
      ,sum(case when OperationTypeID = 2 then 2 else 0 end) as OperationTypeID_2
  from Operations
 group by CardID
тестируйте...
Наверное очепятка, зачем сумму задваивать?
23 ноя 11, 12:04    [11643190]     Ответить | Цитировать Сообщить модератору
 Re: Клиентские карты  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
to Паганель:

Для подсчета OperationTypeID_2 тоже надо в кейсе 1 получать думаю, иначе вообще какой смысл в кейсе?

select CardID
      ,sum(case when OperationTypeID = 1 then 1 else 0 end) as OperationTypeID_1
      ,sum(case when OperationTypeID = 2 then 1 else 0 end) as OperationTypeID_2
  from Operations
 group by CardID
23 ноя 11, 12:05    [11643192]     Ответить | Цитировать Сообщить модератору
 Re: Клиентские карты  [new]
fduch11
Member

Откуда:
Сообщений: 29
Паганель,

То что надо. Сидел тупил пол часа)
23 ноя 11, 12:06    [11643208]     Ответить | Цитировать Сообщить модератору
 Re: Клиентские карты  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
SomewhereSomehow
Наверное очепятка, зачем сумму задваивать?
очепятка конечно

но там главное "ноль или не ноль"
23 ноя 11, 12:10    [11643230]     Ответить | Цитировать Сообщить модератору
 Re: Клиентские карты  [new]
aleks2
Guest
Klick
to Паганель:

Для подсчета OperationTypeID_2 тоже надо в кейсе 1 получать думаю, иначе вообще какой смысл в кейсе?

select CardID
      ,sum(case when OperationTypeID = 1 then 1 else 0 end) as OperationTypeID_1
      ,sum(case when OperationTypeID = 2 then 1 else 0 end) as OperationTypeID_2
  from Operations
 group by CardID


Если операций по картам много - подход порочный.

select *, "только начисление-нет списаний" as X
from Card C
WHERE not exists(select * FROM Operations O WHERE O.OperationTypeID=1 AND O.CardID=C.CardID)
union all
select *, "только списания - нет начислений" as X
from Card C
WHERE not exists(select * FROM Operations O WHERE O.OperationTypeID=2 AND O.CardID=C.CardID)
union all
-- сами напишите.
23 ноя 11, 12:26    [11643392]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить