J'ai du mal à expliquer mon problème mais j'ai ce tableau
ID NUMBER 1 10 1 11 1 12 2 30 2 31 3 11 3 12 3 13
et je veux quelque chose comme ceci:
ID START END 1 10 12 2 30 31 3 11 13
J'ai besoin tous les nombres entiers uniques entre les deux colonnes se transforment en lignes séparées.
Voici à quoi je veux que la transformation ressemble
Je n'ai rien essayé car je ne sais même pas comment appeler une telle procédure, donc toute aide est appréciée
3 Réponses :
Si vous n'avez pas de tableau de nombres (fortement recommandé), vous pouvez utiliser un tableau de pointage ad hoc de concert avec un CROSS APPLY
Exemple
ID Number 1 10 1 11 1 12 2 30 2 31 3 11 3 12 3 13
Select A.ID ,B.Number From YourTable A Cross Apply ( Select Top ([End]-[Start]+1) Number=[START]-1+Row_Number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2 ) B
NB. CROSS APPLY est parfois appelé LATERAL JOIN (sur d'autres plates-formes.)
@Hogan "NB" Je n'ai pas vu ça depuis un certain temps. Me ramène à l'angoisse de mes cours de latin. :)
John: ipso facto - je suppose que je vieillis.
--create table NewTable --( --ID int, --NUMBER int --) DECLARE @ID nvarchar(50) declare @START int declare @END int DECLARE Cursor_Name CURSOR FOR select ID, [START], [End] from tblSequences OPEN Cursor_Name FETCH NEXT FROM Cursor_Name INTO @ID,@START,@END WHILE @@FETCH_STATUS = 0 begin WHILE @START<=@END begin insert into NewTable (ID, NUMBER) Values (@ID, @START) set @START = @START+1 end FETCH NEXT FROM Cursor_Name INTO @ID,@START,@END end
CLOSE Cursor_Name
DEALLOCATE Cursor_Name
sélectionnez * dans NewTable
Les curseurs sont toujours une mauvaise idée en SQL
@Hogan, oui, j'ai accepté, car actuellement j'ai proposé une solution, le cas échéant, puis peut être utilisée. Merci
Dans SQL Server, vous pouvez utiliser un CTE récursif:
with cte as ( select id, [start] as number, [end] as end_number from t union all select id, number + 1 from cte where number < end_number ) select id, number from cte;
Remarque: Si la plage peut dépasser 100, vous avez besoin de l'option (maxrecursion)
pour la requête .
Les CTE récursifs sont généralement un peu plus lents qu'une table de nombres. Cependant, je les trouve beaucoup plus rapides que ce à quoi je m'attendais.