Sql server 删除带有Y/N字段的半重复行

Sql server 删除带有Y/N字段的半重复行,sql-server,Sql Server,我试图每个id_num只显示一行,如果id有“Y”,则保留该行。我似乎不知道怎么做?我曾尝试在“是/否”字段上设置最大值,但由于“付款”字段和“说明”字段不同,因此该操作无效 示例代码: SELECT ID, name, MAX(Y_N), Paid, description FROM MyTable GROUP BY ID, name, Paid, description 这将输出以下链接图像中的数据: 现在的结果是: 我想要的是: SELECT A.ID, A.name, B.Paid,

我试图每个id_num只显示一行,如果id有“Y”,则保留该行。我似乎不知道怎么做?我曾尝试在“是/否”字段上设置最大值,但由于“付款”字段和“说明”字段不同,因此该操作无效

示例代码:

SELECT ID, name, MAX(Y_N), Paid, description
FROM MyTable
GROUP BY ID, name, Paid, description
这将输出以下链接图像中的数据:

现在的结果是:

我想要的是:

SELECT A.ID, A.name, B.Paid, A.Description
FROM MyTable A JOIN
(SELECT ID, name, MAX(Paid) Paid
FROM MyTable
GROUP BY ID, name, Paid) B ON A.ID = B.ID AND A.Paid = B.Paid

根据我上面的评论,此查询将满足您的需要:

SELECT t.* 
FROM MyTable t 
INNER JOIN (
    SELECT ID, 
        MAX(Y_N) as MaxYN 
    FROM MyTable
    ) Filt 
    ON T.ID = Filt.ID 
    AND t.Y_N = Filt.MaxYN

在这种情况下,过滤器查询确定每个id num应该选择哪个Y\N值,然后与基表连接以仅选择那些行。

这里有两种类似的方法

   declare @SemiDupe table (ID int, name varchar(100), Y_N varchar(1), Paid money, description varchar(100));
    insert into @SemiDupe
            SELECT 4545 AS ID, 'bob smith' AS name, 'Y' AS Y_N, 15.39 AS Paid, 'therapy' as description  UNION ALL
            SELECT 4545 AS ID, 'bob smith' AS name, 'N' AS Y_N, 0 AS Paid, '' as description  UNION ALL
            SELECT 1847 AS ID, 'sara tam' AS name, 'N' AS Y_N, 0 AS Paid, '' as description  
            ;


    -- corrected SQL
    Select * 
        From @SemiDupe as A
        Left Join (Select ID, 
            Sum(Case When Y_N = 'Y' Then 1 Else 0 End) as CountY 
            From @SemiDupe  Group by ID) as B
          On A.ID = B.ID
        Where Y_N = 'Y' 
        Or    (Y_N = 'N' and CountY = 0)

    -- Another way
    Select * 
        From @SemiDupe as A
        Left Join (Select ID,  MAX(Y_N) as maxY_N 
            From @SemiDupe  Group by ID) as B
          On A.ID = B.ID
        Where Y_N = 'Y' 
        Or    (Y_N = 'N' and maxY_N = 'N')
结果-只需选择*列来修剪结果,而不是*

ID      name       Y_N  Paid    description ID    CountY
4545    bob smith   Y   15.39   therapy     4545    1
1847    sara tam    N   0.00                1847    0

警告-这不能解决有多个Y行的情况-所有Y行都将列出。

请与我们共享给出错误结果的SQL。使用如下筛选器查询执行联接:从MyTable t内部联接选择ID中选择t.*,T.ID=Filt.ID和T.Y\u N=Filt.MaxYN上MyTable Filt的MAXY\u N as MaxYN我不同意这个问题的结束。图像中有足够的信息来准确推断用户在寻找什么。问题不是关于坏代码,而是关于如何处理我在生成所需输出时遇到的问题?我们都曾经是初学者,使用嵌套过滤查询不一定是新手不看示例就能理解的事情。我也不同意结束这个问题。嵌套的Select/MAX需要替换为Y或N上的Select/SUMCase。我正要发布答案!!用户表示需要为每个id_num显示一行,而不是为每个id_num和名称显示一行。他们也不查找MAXpaid值,而是查找行中包含“Y”的值(如果存在),否则查找唯一行中的值。此查询可能使用此数据示例,但它不会回答用户的问题。