我有一个与此类似的问题,但与sql server 2k8r2有关。数据库有 3 个表。网站、用户users_sites。我需要从用户表中获取电子邮件地址列表以及指示他们是哪些站点的 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
有什么帮助吗?谢谢。
,去掉隐式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
使用GROUP BY
时也不需要DISTINCT
,如果您不希望每siteid
返回一条记录,则siteid
不应该出现在您的GROUP BY
中。
编辑,甚至没有看到你的隐式JOIN
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