我有一个类似于this的问题,但有一点点扭曲,与sql server 2k8r2有关。 数据库有3个表。 sites,users,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
有任何帮助吗? 感谢。
答案 0 :(得分: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
,siteid
如果您不想要GROUP BY
,则不应该siteid
每JOIN
返回一条记录。
编辑,甚至没有看到隐含的{{1}}
答案 1 :(得分: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