我有一个问题,我必须根据列计算查询中应包含哪些记录。
我的表看起来像这样
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而不是总行数。
有人能指出我正确的方向吗?
由于
答案 0 :(得分:3)
或许考虑使用以下组合:
这是一个说明上述概念的伪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等...