需要查询以下情况

时间:2019-04-25 07:51:18

标签: sql sql-server sql-server-2008

我得到类似如下的结果

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

对不起,在这种情况下,我不知道该怎么问。.

请提前提供解决方案

6 个答案:

答案 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 JOINCOALESCE一起使用。

包含示例数据的演示

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'