带有where子句的T-SQL Group by

带有where子句的T-SQL Group by,sql,sql-server,tsql,group-by,where-clause,Sql,Sql Server,Tsql,Group By,Where Clause,根据以上数据,我需要制作 存在CC=US或CC=CN和NLCLA=1和NLDES=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

根据以上数据,我需要制作

  • 存在
    CC=US
    CC=CN
    NLCLA=1
    NLDES=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
在MasterID下必须同时存在CN和我们


有人能帮我在SQL中这样做吗?

您可以通过添加一个
WHERE
子句来完成,该子句将返回带有
US
CN
的行:

53006141
53006143

如果希望结果同时包含
CN
US
,则可以使用:

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

另一种方法是使用
EXISTS
获取包含
US
CN
的masterid列表。然后将其他过滤器放置在
WHERE
子句中,而不是子查询中

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

参见一种方法是使用
CTE

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;
(感谢BlueFoots提供的fiddle数据)


请注意,如果您想要获取特定的行,例如始终为每个
Masterid
获取最新记录,则
ROW\u NUMBER
分区函数将非常有用。但是,由于您没有提供
datetime
列,我只是通过
Masterid

任意订购了
datetime列,如果还有另一行怎么办
53006144 CN 00@LeBlues如果还有一排,你是什么意思?在那种情况下,除了结果会是什么?它将返回相同的结果--@LeBlues如果该行存在,那么它满足
WHERE
的条件,因此它也将返回该行row@LeBlues请参阅我的编辑,它将只返回同时包含
US
CN
的记录,而不返回53006143
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