我得到类似如下的结果
ID Name Status
1 A Y
2 A N
3 B Y
4 B Y
5 C N
在这种情况下,如果名称A的状态具有两个状态,那么我需要一个选择查询来跟踪出局
ID Name Status
1 A N
2 A N
3 B Y
4 B Y
5 C N
对不起,在这种情况下,我不知道该怎么问。.
请提前提供解决方案
答案 0 :(得分:1)
以下脚本将根据您的要求选择数据-
SELECT yt.ID,
yt.Name,
CASE WHEN A.N>1 THEN 'N' ELSE Status END as Status
FROM your_table yt
LEFT JOIN (
SELECT Name,
COUNT(DISTINCT Status) as N
FROM your_table
GROUP BY Name
HAVING COUNT(DISTINCT Status) >1
) A on yt.Name = A.Name
答案 1 :(得分:0)
在下面的查询中,derived table a
提取具有'N'
的不同记录。然后将其与主表连接,并使用case语句提取status
。
使用
Derived Table
select *,
case when a.name is not null then 'N' else #temp.status end [status]
from #temp
Left join (select distinct name from #temp where status ='N' )a on a.name = #temp.name
使用
Case Statement
select *,
case (select count(*) from #temp t where status='N' and t.Name = #temp.Name)
when 1 then 'N'
else status
end [status]
from #temp
OR
select *,
case when (select count(*) from #temp t where status='N' and t.Name = #temp.Name) > 0 then 'N'
else status
end [status]
from #temp
输出
ID Name Status name status
1 A Y A N
2 A N A N
3 B Y NULL Y
4 B Y NULL Y
5 C N C N
答案 2 :(得分:0)
在这种情况下,可以在SELECT中将LEFT JOIN
与COALESCE
一起使用。
包含示例数据的演示
DECLARE @TestTable TABLE (ID INT, [Name] VARCHAR (1), [Status] VARCHAR (1));
INSERT INTO @TestTable(ID, [Name], [Status]) VALUES
(1, 'A', 'Y'),
(2, 'A', 'N'),
(3, 'B', 'Y'),
(4, 'B', 'Y'),
(5, 'C', 'N');
SELECT T.ID,
COALESCE(Q.[Name], T.[Name]) AS [Name],
COALESCE(Q.[Status], T.[Status]) AS [Status]
FROM @TestTable T
LEFT JOIN (
SELECT DISTINCT [Name], 'N' AS [Status]
FROM @TestTable
WHERE [Status] = 'N'
) AS Q ON Q.[Name] = T.[Name]
输出:
ID Name Status
1 A N
2 A N
3 B Y
4 B Y
5 C N
答案 3 :(得分:0)
在单独的查询中使用RANK获取最新ID的状态,并针对该查询保留名称的联接,以使用名称的所有行的最新状态
SELECT a.id, a.name, b.status
FROM dbo.Table_3 a
LEFT JOIN (SELECT id, name, status, RANK() OVER (Partition BY name ORDER BY id desc) AS rnk
FROM dbo.table_3) b ON a.name = b.name AND b.rnk = 1
答案 4 :(得分:0)
您可以使用Windowed函数,这样就不必扫描表两次:
SELECT ID,
[Name],
CASE COUNT(CASE WHEN [Status] = 'N' THEN 1 END) OVER (PARTITION BY [Name]) WHEN 0 THEN [Status] ELSE 'N' END AS [Status]
FROM (VALUES(1,'A','Y'),
(2,'A','N'),
(3,'B','Y'),
(4,'B','Y'),
(5,'C','N')) V(ID, [Name], [Status]);
答案 5 :(得分:0)
对于您的特定示例,您可以仅使用窗口函数:
select ID, Name,
min(Status) over (partition by name) as status
from t;
这是有效的,因为'N'
小于'Y'
,因此,如果任何值为MIN()
,则'N'
将返回'N'
。