从多个表中选择,相同的数据库大小写条件

时间:2013-11-11 20:00:19

标签: sql sql-server-2008-r2 case

我有一个类似于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

有任何帮助吗? 感谢。

2 个答案:

答案 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 BYsiteid如果您不想要GROUP BY,则不应该siteidJOIN返回一条记录。

编辑,甚至没有看到隐含的{{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