2012-05-08 2 views
0

У меня проблема, когда мне нужно рассчитать, какие записи должны быть включены в запрос на основе столбца.Работа с числами в SQL

Моя таблица выглядит примерно так

Client_Id Event ProductID Date   Cart 

1   rem  28   2012-02-23  573473 
1   add  28   2012-02-23  573473 
1   rem  24   2012-02-23  573473 

Как вы можете видеть, что есть надстройка и бэры в столбце Event, это в основном означает, что пользователь либо добавить или удалить продукт из своей телеги.

Что мне нужно получить, это записи, только если значение sayIDID 28 положительно.

28 добавить один, удалить = 0 смысла у них нет предмета в корзине.

Запрос я написал для этого, как:

SELECT Client_Id, 
     Event, 
     ProductID, 
     Date, 
     Cart 
FROM (SELECT *, 
       'Include' = CASE 
          WHEN Total > 0 THEN 1 
          ELSE 0 
          END 
     FROM (SELECT *, 
         [ADD] + REM AS Total 
       FROM (SELECT *, 
           'ADD' = CASE 
             WHEN Event = 'add' THEN 1 
             ELSE 0 
             END, 
           'REM' = CASE 
             WHEN Event = 'rem' THEN -1 
             ELSE 0 
             END 
         FROM Feed) a)b)c 
WHERE c.[Include] = 1 

Но я не могу помочь, но думаю, что это не так, как это только вычисления для ProductID в этой строке не полные строк.

Может ли кто-нибудь указать мне правильное направление?

Благодаря

+0

Порядок не имеет значения до тех пор, как она возвращает правильные строки –

ответ

3

Возможно рассмотреть вопрос об использовании комбинации:

  • Преобразовать «добавить» и «гет» +1 и -1 соответственно SELECT/UNION ВСЕ
  • агрегировать результаты с помощью GROUP BY и SUM

Вот псевдо SQL-иллюстрирующий вышеуказанные понятия:

select sum(quantity), Client_Id, ProductId, Cart 
from 
(
select 1 quantity, * 
from feed 
where event = 'add' 
union all 
select -1 quantity, * 
from feed 
where event = 'rem' 
) temp 
Group BY Client_Id, ProductId, Cart 
+0

Спасибо, что сработало удовольствие! –

0

Подумайте вбок время Если это удалить операцию умножения ProductID на -1, то сумма и подберет> 0.

Однако что произойдет, если они добавляют два 28s. Это дало бы вам 56, что еще что-то ...

Лично я удалял столбец событий и добавлял колонку количества, делаю это отрицательным для удаления. Можно добавить 5 28s и удалить 4 и т.д. ...

+0

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

+0

Так что вы хотите посмотреть, есть ли два добавления 28, две записи или одна запись с количеством двух? Самый простой способ получить то, что вы хотите, - это генерировать количественный столбец из события, чтобы вы его использовали. Слишком поздно? –

1

попробовать это:

SELECT * 
     FROM (SELECT sum(CASE WHEN event = 'add'THEN 1 ELSE 0 END), 
      productid 
     FROM feed 
    GROUP BY productid 
    HAVING sum(DECODE(event,'rem', 0, 'add' ,1,0)) > 0 
    ) A, feed 
    WHERE A.productid = feed.productid 
+0

Это будет работать до тех пор, пока любое количество всегда одно, или количество не требуется. Приятно, кстати ... –

Смежные вопросы