在SQL中使用数字

时间:2012-05-08 10:15:07

标签: sql sql-server

我有一个问题,我必须根据列计算查询中应包含哪些记录。

我的表看起来像这样

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

正如您所看到的,在“事件”列中有一个add和rem,这基本上意味着用户已经从购物车中添加或删除了该产品。

只有当sayID 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而不是总行数。

有人能指出我正确的方向吗?

由于

3 个答案:

答案 0 :(得分:3)

或许考虑使用以下组合:

  • 使用SELECT / UNION ALL
  • 将'add'和'rem'分别转换为+1和-1
  • 使用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

答案 1 :(得分: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

答案 2 :(得分:0)

想想横向时间 如果它是一个删除操作乘以productid -1,那么求和并选择> 0

然而,如果他们添加两个28s会发生什么。那会给你56,这是别的......

就我个人而言,我会抛弃事件列并添加一个数量列,将其删除。你可以添加5 28s并删除4等...