2012-03-22 17 views
5

actualGirar valor singular en fila

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

resultado de la petición de

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

¿Cómo debería hacerlo?

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

SQL se reproduce mejor con datos relacionales. Su resultado no es una relación porque contiene filas duplicadas. – onedaywhen

Respuesta

2

El uso de la recursividad y préstamos código de configuración de 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 

Esto parece correr más rápido en mi caja (5 veces más rápido que Michael Fredrickson de acuerdo con el plan de consulta, pero con muchas más lecturas lógicas), no es que importe mucho

+0

+1 por decir mi nombre dos veces. Además, por la buena solución. –

2

es probable que desee tener una tabla de números pre-pobladas de hacer esto:

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 

Así es como se podría hacer, pero no estoy seguro de por qué le querer hacerlo.

4

Si se sabe que el valor máximo en la columna quantity es inferior a 32.767, puede usar Recursion para generar números y unir los Números para lograr su resultado.

/******************************************* 
    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

Puede ir a más de 100. Consulte MAXRECURSION [en esta página] (http://msdn.microsoft.com/en-us/library/ms175972.aspx) –

+0

@TimLehner: Gracias por informarme. Actualizaré la respuesta. – Akhil

+0

También puede usar MAXRECURSION 0 para ir al infinito. :) –