SQL查询/是或否

时间:2014-07-16 13:14:25

标签: sql sql-server

我是SQL的新手,并尝试编写一些查询来帮助分析一些业务日期。

两张桌子

**Contacts**

| first_name | last_name | email |

**Events**

| email | event_name | status |

我试图运行一个查询来输出我们所有联系人的列表,并显示他们有哪些活动或没有参加。目前我可以生成日期,但它在两个单独的报告中。理想情况下,我希望在每个事件下看起来像是这样或者没有。

| email | event#1 | event #2 | event #3 |

这是我当前的查询;

SELECT email,
    CASE
        WHEN EXISTS (SELECT *
                    FROM events
                    WHERE events.email = contacts.email AND events.event_name='Event 1' AND events.status='Show') THEN 'YES'
                    ELSE 'NO'
                    END AS EVENT#1
  FROM contacts

它会为事件#1正确返回结果,但我无法弄清楚如何包含其他事件。

感谢任何帮助。

感谢。

聚苯乙烯。抱歉格式不佳。

4 个答案:

答案 0 :(得分:1)

使用pivot

select 
    email,
    case [event 1] when 1 then 'yes' else 'no' end as [event 1],
    case [event 2] when 1 then 'yes' else 'no' end as [event 2],
    case [event 3] when 1 then 'yes' else 'no' end as [event 3]
from 
(select * from events where status='show') e
pivot 
(count(status) for event_name in ([event 1],[event 2],[event 3])) p

答案 1 :(得分:0)

嗯,你在events.event_name ='Event 1'上过滤你的结果,所以它应该只返回事件1。 如果您只想要事件2和事件3,那么只需执行相同的存在子查询 除了替换

  events.event_name = 'Event 1'

  events.event_name = 'Event 2'
  events.event_name = 'Event 3'

在每个子查询中,然后您应该获得事件2和事件3的多个列。

答案 2 :(得分:0)

如果事件的数量事先未知,那么这是一个棘手的操作,因为你试图使用事件表中的记录有效的列...这个操作很复杂,通常它被调用枢。您希望从表中的记录(event1,event2,...,eventN)创建结果集中的列。

所有数据库都使用了一些东西来帮助进行数据透视操作,但语法使用略有不同,请查看您的rdbms文档,了解如何在数据库中实现数据透视操作。

否则,如果你知道列数(事件),或者只有少数你可以为其他值重复CASE语句。

答案 3 :(得分:0)

您可以使用PIVOT查询执行此操作,如下所示。但是,如果您有许多事件,那么您可以进行动态旋转。 here

SELECT * FROM
(
  SELECT Contacts.email,Events.eventname
     ,CASE Events.[status] WHEN 'Show' THEN 'Yes' ELSE 'No' END AS [Status]
  FROM Contacts
     JOIN Events ON Contacts.email = Events.email
) AS Source
PIVOT
(
    MIN([Status]) 
    FOR eventname IN
    ([event 1],[event 2],[event 3])
) AS PVT ;