2012-03-22 20 views
5

attualeGirare valore nella singolare fila

Name Quantity 
--------------- 
Stella  2 
Jennifer  2 
Greg   3 

risultato richiesto

Name Quantity 
--------------- 
Stella  1 
Stella  1 
Jennifer  1 
Jennifer  1 
Greg   1 
Greg   1 
Greg   1 

Come dovrei farlo?

declare @T table 
( 
    Name varchar(50), 
    Sales int 
) 
insert into @T values 
('Stella', '2'), 
('Jennifer', '2'), 
('Greg',  '3') 
+0

SQL funziona meglio con i dati relazionali. Il tuo risultato non è una relazione perché contiene righe duplicate. – onedaywhen

risposta

2

utilizzando la ricorsione e prendendo in prestito codice di impostazione di Michael Fredrickson:

declare @T table ( 
    Name varchar(50), 
    Sales int 
) 

insert into @T values ('Stella', '2') 
insert into @T values ('Jennifer', '2') 
insert into @T values ('Greg',  '3') 

-- Recursive verion 
;with People (Name, Sales) as 
(
    select Name, Sales 
    from @T 
    union all 
    select Name, Sales - 1 
    from People 
    where Sales - 1 > 0 
) 
select Name, 1 as Quantity 
from People 
option (maxrecursion 0) -- Recurse without limit 

Questo sembra correre più veloce sulla mia macchina (5x più veloce di Michael Fredrickson di base al piano di query, ma con molte altre letture logiche), non che importi molto.

+0

+1 per pronunciare il mio nome due volte. Inoltre, per la buona soluzione. –

2

probabilmente si vorrà avere un tavolo i numeri pre-popolato per fare questo:

declare @T table ( 
    Name varchar(50), 
    Sales int 
) 

declare @numbers table (
    Number int 
) 

insert into @numbers values (1) 
insert into @numbers values (2) 
insert into @numbers values (3) 
insert into @numbers values (4) 
-- Etc... up to however many numbers is the max possible value for sales... 

insert into @T values ('Stella', '2') 
insert into @T values ('Jennifer', '2') 
insert into @T values ('Greg',  '3') 

SELECT 
    t.Name, 
    1 AS Sales 
FROM 
    @T t JOIN 
    @numbers n ON 
     t.Sales >= n.Number 
ORDER BY t.Name 

è così che si potesse fare, ma non sono sicuro sul perché si voglio farlo.

4

Se il valore massimo nella colonna quantity è inferiore a 32.767, è possibile utilizzare Recursion per generare numeri e unire i numeri per ottenere il risultato.

/******************************************* 
    Max Recursion Count in SQL Server is 32767 
    Limitation of 32767 Numbers! 
******************************************/ 
;WITH Numbers (Number) AS 
(
    SELECT 1 
    UNION ALL 
    SELECT 1 + Number FROM Numbers WHERE Number < 100 
) 
SELECT m.Name, 
     Quantity = 1 
    FROM MyTable m 
     JOIN @numbers n ON m.Quantity <= n.Number 
OPTION (MAXRECURSION 32767); 
+0

Puoi andare oltre 100. Vedi MAXRECURSION [in questa pagina] (http://msdn.microsoft.com/en-us/library/ms175972.aspx) –

+0

@TimLehner: Grazie per avermelo detto. Aggiornerò la risposta – Akhil

+0

È anche possibile utilizzare MAXRECURSION 0 per andare all'infinito. :) –

Problemi correlati