2013-02-12 80 views
1
Masterid CC CLA DES NLCLA NLDES 
------------------------------------- 
53006141 CN 0 0 1  1 
53006141 US 1 1 1  1 
53006141 UK 1 1 0  0 
53006142 US 1 1 0  0 
53006142 UK 1 1 0  0 
53006143 CN 0 0 1  1 
53006143 US 1 1 0  0 
53006143 UK 1 1 0  0 

从上述数据我需要产生T-SQL组通过用where子句

  • MasterIds其中存在CC = USCC = CNNLCLA = 1NLDES = 1

的列表输出应该是

53006141 
53006143 

在MasterID下必须同时存在CN和US。

有人可以帮我在SQL中做到这一点吗?

回答

7

您可以通过添加一个WHERE条款后者以两种USCN返回行做到这一点:

select distinct Masterid 
from yourtable 
where cc in ('US', 'CN') 
    and NLCLA = 1 
    AND NLDES = 1 

SQL Fiddle with Demo

如果你想要的结果同时包含CNUS,然后您可以使用:

select Masterid 
from yourtable 
where cc in ('US', 'CN') 
    and NLCLA = 1 
    AND NLDES = 1 
group by masterid 
having count(distinct cc) = 2 

请参阅SQL Fiddle with Demo

这样做的另一种方法是使用EXISTS来获取MasterIds列表,同时使用USCN。然后,您将其他筛选器放在WHERE子句中,而不是放在子查询中。

select distinct masterid 
from yourtable t1 
where exists (select Masterid 
       from yourtable t2 
       where cc in ('US', 'CN') 
       and t1.masterid = t2.masterid 
       group by masterid 
       having count(distinct cc) = 2) 
    and NLCLA = 1 
    and NLDES = 1; 

SQL Fiddle with Demo

+0

如果还有另外一行怎么办
53006144 CN 0 0 0 0 – LeBlues 2013-02-12 15:15:34

+0

@LeBlues如果有另一行,你的意思是什么?在这种情况下除了结果之外,你会做什么?它会返回相同的结果 - http://sqlfiddle.com/#!3/968a1/1 – Taryn 2013-02-12 15:16:14

+0

@LeBlues如果该行存在,那么它符合'WHERE'的标准,所以它也将返回该行 – Lamak 2013-02-12 15:17:25

0

一种方法是使用一个CTE

WITH CTE AS 
(
    SELECT Masterid,CC,CLA,DES,NLCLA,NLDES, 
     RN = ROW_NUMBER() OVER (PARTITION BY Masterid ORDER BY Masterid) 
    FROM dbo.Table 
    WHERE CC IN('US', 'CN') 
    AND  NLCLA = 1 
    AND  NLDES = 1 
) 
SELECT Masterid FROM CTE WHERE RN = 1 

Demo(感谢bluefeet的小提琴数据)

注意,ROW_NUMBER分区功能将是有益的如果你想获得特定的行,例如总是每个的最新记录。但由于您没有提供datetime专栏,我刚刚通过Masterid任意订购。