C'est complexe à expliquer. Je donne l'exemple

Les données

id  value
-- -------
1    61
2    50
3     A
4    61
5   750
6    61
7    20
8     A

Résultat attendu

id  value  code
--  -----  ----
1      61      A
4      61  OTHER 
6      61      A

Comment ça devrait être comme ça:

Je souhaite sélectionner des lignes dont la valeur est 61

Si appartiennent deux, la valeur 61 a un 'A' donc la valeur du code est 'A' sinon le résultat est 'OTHER' comment puis-je faire cela avec une instruction select.

MODIFIER:

La logique :

Si le value 61 existe, et si l'une des colonnes précédentes contient A alors la colonne code doit écrire A, sinon OTHER. Dans l'exemple de données donné:

id  value
-- -------
1    61
2    50
3     A

Id 1, a la valeur 61, et ses valeurs précédentes (jusqu'au prochain 61) contient un A donc il devrait imprimer:

id  value  code
--  -----  ----
1      61      A

Cependant, les 61 suivantes et les lignes précédentes ne le font pas:

4    61
5   750

Donc il devrait imprimer:

4   61  OTHER

Merci d'avance

0
Ersin Gülbahar 27 nov. 2017 à 22:11

3 réponses

Meilleure réponse

Enfin j'ai trouvé une solution

WITH SUBQ AS
(
SELECT 1 AS id,'61' AS value UNION ALL
SELECT 2,   '50' UNION ALL
SELECT 3,   'A'  UNION ALL
SELECT 4,   '61'  UNION ALL
SELECT 5,   '750'  UNION ALL
SELECT 6,   '61'  UNION ALL
SELECT 7,   '20'  UNION ALL
SELECT 8,   'A'
),
SUBQ2 AS
(
SELECT 
 id,
 value
FROM SUBQ
WHERE value IN ('A')
),
SUBQ3 AS
(
SELECT 
 id,
 value,
 LEAD(id,1,999999999)OVER(ORDER BY id) AS NEXT_GKEY
FROM SUBQ
  WHERE value = '61'
),
SUBQ4 AS
(
SELECT
 SUBQ3.id,
 SUBQ2.value
FROM SUBQ3 
INNER JOIN SUBQ2 ON SUBQ2.id BETWEEN SUBQ3.id AND SUBQ3.NEXT_GKEY
),
SUBQ5 AS
(
SELECT id
FROM SUBQ3
WHERE id NOT IN
(
SELECT id FROM  SUBQ4
)
),
SUBQ6 AS
(
SELECT 
id ,
'OTHER' AS REASON
FROM SUBQ5
UNION 
SELECT 
id,
CAST(value AS VARCHAR(100)) AS REASON
FROM SUBQ4
)
SELECT * FROM SUBQ6 ORDER BY id
0
Ersin Gülbahar 27 nov. 2017 à 21:23

Essaye ça

    create table #MyTable(id int, value varchar(10))
    insert into #MyTable values(1,'61')
    insert into #MyTable values(2,'50')
    insert into #MyTable values(3,'A')
    insert into #MyTable values(4,'61')
    insert into #MyTable values(5,'750')
    insert into #MyTable values(6,'61')
    insert into #MyTable values(7,'20')
    insert into #MyTable values(8,'A')
    --insert into #MyTable values(9,'61')



    --Select * from #MyTable

    Select ROW_Number() over(order by id) as rn, * 
    into #tmp1  
    from #MyTable where value='61'


    SELECT t1.id,t1.value
        ,CASE WHEN MAX(t.value) ='A' THEN 'A'
        ELSE 'OTHER' END AS COde
    FROM #MyTable t
    JOIN #tmp1 t1 on t1.id<t.id
    JOIN #tmp1 t2 on (t1.rn=t2.rn-1 and t.id<t2.id)
    Group by t1.id,t1.value

    UNION


    /*For Last Row with 61*/
    SELECT t1.id,t1.value
        ,CASE WHEN MAX(t.value) ='A' THEN 'A'
        ELSE 'OTHER' END AS COde FROM 
    (SELECT TOP 1 * from #tmp1 order by rn desc) t1 
    JOIN #MyTable t on t.id>=t1.id
    Group by t1.id,t1.value


    Drop table #MyTable

    Drop table #tmp1
0
Sahi 28 nov. 2017 à 09:08

Vous pouvez utiliser une auto-jointure externe pour le résoudre.

select t.id, t.value, case when t.rn = 1 and t.cnt > 0 then 'A' else 'OTHER' end code
from
(
  select d1.*, 
         row_number() over (partition by d1.value, count(d2.id) order by d1.id desc) rn,
         count(d2.id) cnt
  from data d1
  left join data d2 on d1.id < d2.id and d2.value = 'A'
  group   by d1.id, d1.value
) t
where t.value = '61'
order by t.id

démo

La colonne cnt est utilisée pour résoudre la dernière occurrence '61'.

1
Radim Bača 27 nov. 2017 à 20:45
47518176