带有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