SQL不根据其中一行中的值选择多行

时间:2014-01-09 09:06:06

标签: sql-server

很难解释这一点。我正在努力获得新会员资格的数量,这应该很容易,因为我只选择加入日期。但是,由于数据库的设计,它正在获取我不想包含的成员资格转换。查找是否为转换的唯一方法是查看名为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那么它仍将保留已添加的记录,这将被视为新的销售,而不是。

除了在几个表中传播的数据之外,还有更多的数据,但这给出了一般的想法。在示例字段中,前两个字段位于一个表中,历史记录操作位于由内部联接链接的单独表中,并且是为同一个人创建多个行的表。

感激地接受任何提示!

3 个答案:

答案 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')