我只是在刷一些SQL - 换句话说,我真的生锈 - 而且此刻有点卡住了。它可能是微不足道的,但我们会看到。
我想选择所有具有奇数个特定属性且不是整数的人(在此示例中为TransactionType)。因此,例如,采取以下测试/非真实信息这些人购买汽车或类似的大型购买。
Name TransactionType Date
John Buy 5/1
John Cancel 5/1
John Buy 5/2
Joseph Buy 5/25
Joseph Cancel 5/25
Tanya Buy 5/28
我希望能让那些交易数量奇怪的人回归;换句话说,他们最终购买了该物品。因此,在这种情况下,John和Tanya将被选中,而Joseph则不会。
我知道我可以在这里使用模数操作数,但我有点失去了如何正确使用它。 我想过用
count(TransactionType) % 2 != 0
在where子句中,但这显然是禁止的。任何正确方向的指针都会非常有用。如果不清楚,请告诉我,谢谢!
答案 0 :(得分:3)
你很亲密。你需要一个having子句而不是where子句。
select Name
from table
group by Name
having count(TransactionType) % 2 != 0
答案 1 :(得分:2)
您最好在交易日期之前获取最新状态并使用该状态而不是依靠计算TransactionType
来确定最新状态:
这样的事情:
SELECT b.Name, b.TransactionType, b.[Date]
FROM (
SELECT Name, MAX(t1.[DATE]) latestDate
FROM [Transactions] t1
GROUP BY t1.Name
) a
INNER JOIN [Transactions] b ON b.Name = a.Name AND a.latestDate = b.[Date]
WHERE b.TransactionType = 'Buy'
假设您的日期是包含时间的有效日期,这应该有效。
如果您只存储日期部分,那么购买和取消的人在同一日期的最大日期相同,因此它会返回更多数据和一些不正确的记录。