具有逻辑功能的SQL GROUP BY

时间:2016-08-02 02:16:14

标签: sql sql-server

我处理多个表中的数据,这些表由每个人的唯一标识符链接。

让我们说一个名为Eventstab的表包含一个ID列表,每次事件发生在该ID时,它都会列出该ID旁边的事件。我们打电话给事件"买了一个马铃薯","从椅子上掉下来","看了一部电影"。

所以Eventstab看起来像

ID  | Event
----------------------    
200 | fell off a chair
200 | bought potato
200 | fell off a chair
500 | bought potato

所以,正如你所看到的 - 身份200从椅子上掉下来,500没有。

此Eventstab包含主数据中的ID的SUBSET数据。我们可以得出结论,如果一个ID出现在主要数据中,而不是出现在Eventstab中,那么他们就永远不会从椅子上掉下来。

可以使用以下查询恢复上述信息:

SELECT id, event 
FROM thedatums 
JOIN Eventstab ON id 
WHERE ...

我有兴趣为数据集中的每个人找到他们是否曾经从椅子上掉下来。 I.E是否事件='从椅子上掉下来'该ID。

更具体地说,我喜欢变量我会打电话给#a; is_a_dimwit'如果id EVER有一个从椅子上掉下来的记录,则该等于1'在Eventstab中,否则为0。

所以在我的脑海中

SELECT 
    id, 
    CASE 
       WHEN event = 'fell off chair' THEN 1 
       ELSE 0 
    END AS 'is_a_dimwit' 
FROM 
    thedatums 
JOIN 
    Eventstab ON id

编辑:有记录显示多个'从椅子上掉下来重复ID'

但是,我希望每个ID在我的数据集中都是唯一的,而且这个' is_a_dimwit'变量来衡量这个人是否从我拥有的数据中掉了一把椅子。

我的问题有两个:我怎么去谷歌搜索一个可能的答案呢?更好的是,你会如何解决它?

1 个答案:

答案 0 :(得分:2)

听起来你想要这样的东西:

select i.id,
       (case when exists (select 1 from thedatums where td.id = i.id and td.event = 'fell off chair')
             then 1
             when exists (select 1 from some_data where td.id = i.id and td.event = 'fell off chair')
             then 1
             else 0
        end) as is_a_dimwit
from ((select id from thedatums)
      union -- on purpose to remove duplicates
      (select id from some_data)
     ) i;