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
3 réponses
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
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
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
La colonne cnt
est utilisée pour résoudre la dernière occurrence '61'.
De nouvelles questions
sql
Le langage de requête structuré (SQL) est un langage permettant d'interroger des bases de données. Les questions doivent inclure des exemples de code, une structure de table, des exemples de données et une balise pour l'implémentation du SGBD (par exemple MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, etc.) utilisés. Si votre question concerne uniquement un SGBD spécifique (utilise des extensions / fonctionnalités spécifiques), utilisez plutôt la balise de ce SGBD. Les réponses aux questions marquées avec SQL doivent utiliser le standard SQL ISO / IEC.