Удалить полудублированный ряд с полем Y / N - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь показать только одну строку на id_num, и если у ID есть «Y», оставьте эту строку. Я не могу понять, как? Я попытался сделать максимум для поля Y / N, но это не работает, так как поля платного и описания отличаются.

КОД ОБРАЗЦА:

SELECT ID, name, MAX(Y_N), Paid, description
FROM MyTable
GROUP BY ID, name, Paid, description

Вывод данных на изображениях, связанных ниже:

Результаты сейчас:

Output from above sample query

Что я хочу:

Output I need

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Этот запрос, из моего комментария выше, будет делать то, что вам нужно:

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

В этом случае запрос фильтра определяет, какое значение Y_N должно быть выбрано для каждого id_num, затем присоединяетсяс базовой таблицей, чтобы выбрать только эти строки.

0 голосов
/ 18 октября 2019

Вот два аналогичных способа сделать это.

   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')

Результаты - (просто выберите столбцы A. *, чтобы обрезать результаты вместо *)

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 - все они будут перечислены.

0 голосов
/ 18 октября 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...