Discussion:
Sql Split Range
(too old to reply)
Marco Montagnani
2013-02-18 19:07:09 UTC
Permalink
Buongiorno a tutti,
mi chiedevo se fosse possibile da una tabella di questo tipo:

DECLARE @tblCelle TABLE(nr INT, interval INT)
INSERT INTO @tblCelle
SELECT 1, 1 UNION
SELECT 5, 2 UNION
SELECT 11, NULL

ottenere una tabella del tipo senza utilizzare cicli while o cursori
SELECT 1 UNION
SELECT 2 UNION
SELECT 3 UNION
SELECT 4 UNION
SELECT 5 UNION
SELECT 7 UNION
SELECT 9 UNION
SELECT 11

ricavata aggiungendo alla riga l'intervallo sino a raggiungere il numero della riga successiva.

Avete una soluzione?
Grazie.
Erland Sommarskog
2013-02-18 19:15:27 UTC
Permalink
Post by Marco Montagnani
Buongiorno a tutti,
SELECT 1, 1 UNION
SELECT 5, 2 UNION
SELECT 11, NULL
ottenere una tabella del tipo senza utilizzare cicli while o cursori
SELECT 1 UNION
SELECT 2 UNION
SELECT 3 UNION
SELECT 4 UNION
SELECT 5 UNION
SELECT 7 UNION
SELECT 9 UNION
SELECT 11
ricavata aggiungendo alla riga l'intervallo sino a raggiungere il numero
della riga successiva.
SELECT Number
FROM Numbers N
WHERE EXISTS (SELECT *
FROM @tblCelle C
WHEEE N.Numbers BETWEEN C.nr AND C.nr + C.Interval)

Per detaglie sulla tabella Numbers, per favor leggi
http://www.sommarskog.se/arrays-in-sql-2005.html#tblnum
--
Erland Sommarskog, SQL Server MVP, ***@sommarskog.se

Links for SQL Server Books Online:
SQL 2008: http://msdn.microsoft.com/en-us/sqlserver/cc514207.aspx
SQL 2005: http://msdn.microsoft.com/en-us/sqlserver/bb895970.aspx
Marco Montagnani
2013-02-20 07:29:21 UTC
Permalink
Post by Marco Montagnani
Buongiorno a tutti,
SELECT 1, 1 UNION
SELECT 5, 2 UNION
SELECT 11, NULL
ottenere una tabella del tipo senza utilizzare cicli while o cursori
SELECT 1 UNION
SELECT 2 UNION
SELECT 3 UNION
SELECT 4 UNION
SELECT 5 UNION
SELECT 7 UNION
SELECT 9 UNION
SELECT 11
ricavata aggiungendo alla riga l'intervallo sino a raggiungere il numero della riga successiva.
Avete una soluzione?
Grazie.
Grazie della risposta ma la soluzione non mi sembra funzionare
la query proposta ritorna:

1,2,5,6,7 invece di 1,2,3,4,5,7,9,11

dove sbaglia?
Erland Sommarskog
2013-02-20 16:32:39 UTC
Permalink
Post by Marco Montagnani
Grazie della risposta ma la soluzione non mi sembra funzionare
1,2,5,6,7 invece di 1,2,3,4,5,7,9,11
dove sbaglia?
Scusami! Non ho letto il tuo articolo corretto! Qui è una soluzione per
SQL 2012:

; WITH CTE AS (
SELECT nr, interval, LEAD(nr, 1) OVER (ORDER BY nr) AS next
FROM @tblCelle a
)
SELECT n.Number
FROM CTE c
JOIN numbers.dbo.Numbers n ON n.Number >= c.nr
AND n.Number < c.next
WHERE n.Number % interval = c.nr % interval
UNION ALL
SELECT MAX(nr)
FROM CTE

Per SQL 2008 i altre versione più vecchi, il colonne next deve si
esoresse come:

(SELECT MIN(b.nr) FROM @tblCelle b
WHERE b.nr > a.nr) AS next
--
Erland Sommarskog, SQL Server MVP, ***@sommarskog.se

Links for SQL Server Books Online:
SQL 2008: http://msdn.microsoft.com/en-us/sqlserver/cc514207.aspx
SQL 2005: http://msdn.microsoft.com/en-us/sqlserver/bb895970.aspx
Continue reading on narkive:
Loading...