3
 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

从上面的数据我需要产生

  • MasterIdsCC = USorCC = CNNLCLA = 1and的列表NLDES = 1

输出应该是

53006141
53006143

MasterID 下必须有 CN 和 US。

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

4

2 回答 2

11

您可以通过添加一个WHERE子句来执行此操作,该子句将返回带有USor的行CN

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

请参阅带有演示的 SQL Fiddle

如果您希望结果同时包含CNand US,那么您可以使用:

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获取 MasterId 的列表。然后将其他过滤器放在子句中而不是子查询中。USCNWHERE

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

于 2013-02-12T15:13:03.487 回答
1

一种方法是使用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

演示(感谢 bluefeet 的小提琴数据)

请注意,ROW_NUMBER如果您想获取特定行,则分区函数会很有帮助,例如每个Masterid. 但是由于您没有提供datetime专栏,我只是随意订购了Masterid

于 2013-02-12T15:14:54.167 回答