我是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正确返回结果,但我无法弄清楚如何包含其他事件。
感谢任何帮助。
感谢。
聚苯乙烯。抱歉格式不佳。
答案 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 ;