很难解释这一点。我正在努力获得新会员资格的数量,这应该很容易,因为我只选择加入日期。但是,由于数据库的设计,它正在获取我不想包含的成员资格转换。查找是否为转换的唯一方法是查看名为History actions的表,其中包含void事务。所以目前我的数据看起来有点像这样
Date Name History Action
1/1/2014 Fred Bloggs Added
1/1/2014 Joe Bloggs Added
1/1/2014 Joe Bloggs Void
1/1/2014 John Doe Added
2/1/2014 Jane Doe Added
2/1/2014 Jane Doe Void
由此,我只想要Fred Bloggs和John Doe的行,因为他们是新成员。 Joe Bloggs和Jane Doe是旧会员的转换,而不是新的销售,因此不应包括在内。
如何告诉SQL不要选择任何Joe Bloggs或Jane Doe记录,因为其中一个是Void?如果我只是说在哪里!= Void那么它仍将保留已添加的记录,这将被视为新的销售,而不是。
除了在几个表中传播的数据之外,还有更多的数据,但这给出了一般的想法。在示例字段中,前两个字段位于一个表中,历史记录操作位于由内部联接链接的单独表中,并且是为同一个人创建多个行的表。
感激地接受任何提示!
答案 0 :(得分:0)
你可以这样做
SELECT Name
FROM HistoryActions
GROUP BY Name
HAVING MAX(CASE WHEN HistoryAction = 'Added' THEN 1 ELSE 0 END) > 0
AND MAX(CASE WHEN HistoryAction = 'Void' THEN 1 ELSE 0 END) = 0
或
SELECT Name
FROM HistoryActions h
WHERE NOT EXISTS
(
SELECT *
FROM HistoryActions
WHERE Name = h.Name
AND HistoryAction = 'Void'
)
输出:
| NAME | |-------------| | Fred Bloggs | | John Doe |
这是 SQLFiddle 演示
答案 1 :(得分:0)
SELECT *
FROM table
WHERE Name NOT IN (SELECT Name FROM table WHERE Action = 'Void')
但这样做并不酷,因为你可以有相同的名字,所以使用一些用户ID字段而不是Name。
答案 2 :(得分:0)
你也可以这样做......
SELECT * FROM YourTable WHERE Name NOT IN (SELECT Name FROM YourTable WHERE UPPER(Action) = 'VOID')