0

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

我的表看起来像这样

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 列中有一个 add 和 rem,这基本上意味着用户已经从他们的购物车中添加或删除了产品。

我需要得到的是只有当 productID 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 而不是总行数。

谁能指出我正确的方向?

谢谢

4

3 回答 3

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
于 2012-05-08T10:39:26.430 回答
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
于 2012-05-08T10:42:13.730 回答
0

考虑横向时间如果是删除操作,将 productid 乘以 -1,然后求和并选择 > 0。

但是,如果他们添加两个 28 会发生什么。那会给你56,这是另一回事....

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

于 2012-05-08T10:29:08.400 回答