Superenalotto & TSQL
La febbre da Superenalotto sta contagiando moltissimi, anche chi non ha mai giocato prima d'ora.
Insomma, il premio in palio fa parecchia gola, soprattutto in tempo di crisi, no?
Se devo fare una confessione anche io ho speso un euro oggi... e mi sono lasciato tentare.
Poi mi sono preso una mezz'oretta ed ho giocato una cifra ben più alta, ma tutta virtuale.
In pratica ho fatto mille giocate e domani voglio proprio vedere se qualcuna di queste è quella corretta (poi, se dovesse uscire quella corretta, non so come la prenderei... :-))
Detto questo ecco quello che ho fatto, in TSQL, of course...
1. Creo la tabella in cui memorizzare le giocate (una riga per giocata, con la memorizzazione delle diverse sei cifre):
IF OBJECT_ID('dbo.enalotto', 'U') IS NOT NULL
DROP TABLE dbo.enalotto
GO
create table dbo.enalotto
(
idRecord int primary key identity(1,1),
num1 tinyint,
num2 tinyint,
num3 tinyint,
num4 tinyint,
num5 tinyint,
num6 tinyint,
numUnique bigint unique,
check (num1 <> num2 and num1 <> num3 and num1 <> num4 and num1 <> num5 and num1 <> num6),
check (num2 <> num1 and num2 <> num3 and num2 <> num4 and num2 <> num5 and num2 <> num6),
check (num3 <> num1 and num3 <> num2 and num3 <> num4 and num3 <> num5 and num3 <> num6),
check (num4 <> num1 and num4 <> num3 and num4 <> num2 and num4 <> num5 and num4 <> num6),
check (num5 <> num1 and num5 <> num3 and num5 <> num4 and num5 <> num2 and num5 <> num6),
check (num6 <> num1 and num6 <> num3 and num6 <> num4 and num6 <> num5 and num6 <> num2)
)
go
2. faccio 1.000 giocate:
set nocount on
declare @i int
set @i = 0
while @i < 1000
begin
begin try
insert enalotto
select
num1, num2, num3, num4, num5, num6,
cast(
cast(num1 as bigint) * 10000000000
+ cast(num2 as bigint) * 100000000
+ cast(num3 as int) * 1000000
+ cast(num4 as int) * 10000
+ cast(num5 as int) * 100 + num6
as bigint) as u
from
(
SELECT
CONVERT(tinyint, (90)*RAND()) + 1 as [num1],
CONVERT(tinyint, (90)*RAND()) + 1 as [num2],
CONVERT(tinyint, (90)*RAND()) + 1 as [num3],
CONVERT(tinyint, (90)*RAND()) + 1 as [num4],
CONVERT(tinyint, (90)*RAND()) + 1 as [num5],
CONVERT(tinyint, (90)*RAND()) + 1 as [num6]
) T
set @i = @i + 1
end try
begin catch
end catch
end
go
3. le vedo (faccio una select della tabella così come è popolata):
--> queste le giocate
select * from enalotto
go
4. le vedo su riga (quindi sei righe per ogni giocata):
--> vedo su riga le giocate
select idRecord, num1 from enalotto
union all
select idRecord, num2 from enalotto
union all
select idRecord, num3 from enalotto
union all
select idRecord, num4 from enalotto
union all
select idRecord, num5 from enalotto
union all
select idRecord, num6 from enalotto
order by idRecord
5. ordino le giocate dal numero più piccolo (con la funzione row_number, mi serve per sapere l'ordine di visualizzazione):
--> ordino le giocate dal numero più piccolo
select
idRecord, Num,
ROW_NUMBER() OVER(partition by idRecord order by num ) as ord
from
(
select idRecord, num1 as num from enalotto
union all
select idRecord, num2 from enalotto
union all
select idRecord, num3 from enalotto
union all
select idRecord, num4 from enalotto
union all
select idRecord, num5 from enalotto
union all
select idRecord, num6 from enalotto
) tabellaGiocateSuRiga
order by idRecord
6. visualizzo l'estrazione completa dal numero più piccolo (tramite la funzione pivot giro le righe con le colonne ed ottengo la visualizzazione corretta):
--> visualizzo di nuovo in colonna, dal numero più piccolo
select idRecord, [1], [2], [3], [4], [5] , [6]
from
(
select
idRecord, Num,
ROW_NUMBER() OVER(partition by idRecord order by num ) as ord
from
(
select idRecord, num1 as num from enalotto
union all
select idRecord, num2 from enalotto
union all
select idRecord, num3 from enalotto
union all
select idRecord, num4 from enalotto
union all
select idRecord, num5 from enalotto
union all
select idRecord, num6 from enalotto
) tabellaGiocateSuRiga
) Tab
pivot
(
sum(Num)
for ord in ([1],[2],[3],[4],[5],[6])
) as pivotTable
order by idRecord
