0

J'ai ci-dessous CTE récursive:COMMENT FAIRE: Inclure la colonne qui ne fait pas partie d'une fonction globale ou groupe par clause dans SQL Server

DECLARE @T AS TABLE 
(
    PARENT_TEST_ID int, 
    TEST_ID int, 
    VALIDATED int, 
    ERR int 
) 

INSERT INTO @T VALUES 
(NULL, 1, 0, 0), 
(NULL, 2, 0, 0), 
(1,3,0, 0), 
(1,4,0, 0), 
(2,5,0, 0), 
(2,6,0, 0), 
(2,7,0, 0), 
(7,8,0, 1) 

;with C as 
(
    select TEST_ID, PARENT_TEST_ID, (CASE WHEN ERR=1 THEN 0 ELSE 1 END) AS VALIDATED, ERR 
    from @T 
    where TEST_ID not in (select PARENT_TEST_ID 
        from @T 
        where PARENT_TEST_ID is not null) AND PARENT_TEST_ID IS NOT NULL 
    union all 
    select 
    T.TEST_ID, 
    T.PARENT_TEST_ID, 
    (case when t.TEST_ID=c.PARENT_TEST_ID and c.VALIDATED=1 AND T.ERR=0 THEN 1 ELSE 0 END) as VALIDATED, 
    T.ERR 
    from @T as T 
    inner join C 
     on T.TEST_ID = C.PARENT_TEST_ID 
) 
SELECT DISTINCT PARENT_TEST_ID, TEST_ID, MIN(VALIDATED) FROM C 
GROUP BY TEST_ID 

Mais je ne peux pas inclure la colonne PARENT_TEST_ID dans le résultat SELECT car il ne fait pas partie du groupe par article, donc j'ai trouvé ce lien:

Including column that is not part of the group by

alors maintenant, je suis en train de faire la même chose dans mon cas, je suis en train d'appliquer la solution John Woo mais je ne sais pas comment. De l'aide? Ou toute autre meilleure solution?

+0

Je Je vous ai donné une réponse à la question que vous avez posée, mais à partir de vos données de test, je ne pense pas que ce soit réellement ce que vous cherchez à faire. Pouvez-vous s'il vous plaît inclure votre sortie souhaitée si ma réponse ci-dessous n'est pas ce que vous essayez de faire? – iamdave

Répondre

0

il suffit de changer votre dernière ligne GROUP BY PARENT_TEST_ID, TEST_ID

L'erreur que vous obtenez est de vous dire que vous ne pouvez pas ajouter des colonnes à la sortie si vous ne soit ensemble sur ou regrouper vos autres agrégats par celui-ci. En ajoutant la colonne au group by, vous indiquez à SQL Server que vous souhaitez effectuer votre min à la fois par le parent et les valeurs d'ID de test.

rextester: http://rextester.com/JRF55398

0

iamdave est juste, mais si vous voulez mettre en œuvre la solution de John Woo de cette réponse liée, il ressemblerait à ceci:

rextester: http://rextester.com/QQQGM79701

;with C as (
    select 
    test_id 
    , parent_test_id 
    , validated=(case when err = 1 then 0 else 1 end) 
    , err 
    from @T as t 
    where t.test_id not in (
    select i.parent_test_id 
    from @T as i 
    where i.parent_test_id is not null 
    ) 
    and t.parent_test_id is not null 
    union all 
    select 
    t.test_id 
    , t.parent_test_id 
    , validated = case 
     when t.test_id = c.parent_test_id 
     and c.validated = 1 
     and t.err = 0 
     then 1 
     else 0 
     end 
    , t.err 
    from @T as T 
    inner join c on t.test_id = c.parent_test_id 
) 
, r as (
    select 
    parent_test_id 
    , test_id 
    , Validated 
    , rn = row_number() over (
     partition by test_id 
     order by Validated 
    ) 
    from C 
) 
select 
    parent_test_id 
    , test_id 
    , Validated 
    from r 
    where rn=1