0

我有一个与此类似的问题但与 sql server 2k8r2 有更多的不同。数据库有 3 个表。站点、用户、users_sites。我需要从 users 表中获取电子邮件地址列表以及 2 列指示他们是哪些站点的成员。用户可以是 1、2 的成员,也可以是无成员(很可能是不活动的)。

这是我的脚本,但我不断为每封电子邮件获取 2 行,但我的目标是获取 3 列电子邮件,site1 成员为 1 或 site2 成员为 0,或者如果两者都有,则为 1,1,如果没有则为 0,0

+----------+-------+-------+
|emailAddy | site1 | site2 |
+------+-----------+-------+
|1@test.co | 0     | 1     |
|1@test.co | 1     | 0     |
|2@test.jp | 1     | 1     |
|2@test.jp | 1     | 1     |
+----------+-------+-------+


SELECT distinct emailaddress
,CASE WHEN cast(siteid AS varchar(max))= '1' THEN 1 ELSE 0 END AS site1
,CASE WHEN cast(siteid AS varchar(max))= '2' THEN 1 ELSE 0 END AS site2
FROM Users, Users_Sites 
GROUP BY emailaddress,siteID

有什么帮助吗?谢谢。

4

2 回答 2

1

首先,摆脱隐式JOIN(将其替换为显式JOIN,如下所示),因为您没有标准,只是将每条记录连接到另一个表中的每条记录。

然后只需将您的条件包装在一个聚合中:

SELECT emailaddress
      ,MAX(CASE WHEN cast(siteid AS varchar(max))= '1' THEN 1 ELSE 0 END) AS site1
      ,MAX(CASE WHEN cast(siteid AS varchar(max))= '2' THEN 1 ELSE 0 END) AS site2
FROM Users u
JOIN Users_Sites us
   ON u.user_id = us.user_id  --No idea what your actual join criteria should be.
GROUP BY emailaddress

DISTINCT使用时GROUP BY也不需要siteidGROUP BY如果您不希望每个siteid.

编辑,甚至没有看到你的隐含JOIN

于 2013-11-11T20:04:12.723 回答
0
Select u.emailAddress,
   case when exists(Select * from Users_Sites 
                    Where SiteId = 1 
                      And UserId = u.UserId) 
        then 'x' End Site1,
   case when exists(Select * from Users_Sites 
                    Where SiteId = 2 
                      And UserId = u.UserId) 
        then 'x' End Site2
From users u
于 2013-11-11T20:10:44.737 回答