Ver Mensaje Individual
  #5 (permalink)  
Antiguo 09/11/2012, 04:34
GeriReshef
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 12 años, 6 meses
Puntos: 40
Respuesta: Consulta acerca de blogs

Primero que nada- creamos una tabla temporal,
Con todos los valores de la cadena:
Código SQL:
Ver original
  1. DECLARE @S1 VARCHAR(MAX);
  2.  
  3. SELECT  @S1='407.16, 536.82, 1187.03, 923.94, 80.39, 651.46, 1547.90, 119.99, 110.66, 621.76, 62.6, 1616.24, 227.85, 878.06, 824.76, 950.04, 1125.95, 208.80, 2004.48, 3358.20, 1272.52';
  4.  
  5. IF Object_ID('tempdb..#T') IS NOT NULL DROP TABLE #T;
  6.  
  7. CREATE TABLE #T(Valor DECIMAL(12,2),
  8.                 Total DECIMAL(12,2));
  9.  
  10. CREATE Clustered INDEX Idx_#T ON #T (Valor DESC, Total DESC);
  11.  
  12. DECLARE @I INT;
  13. While   @S1<>''
  14.         BEGIN
  15.         SET     @I=CharIndex(',',@S1+',');
  16.         INSERT INTO #T(Valor) SELECT LEFT(@S1,@I-1);
  17.         SET     @S1=Stuff(@S1,1,@I,'');
  18.         END
Ahora actualizamos la columna Total con los subtotales según el orden de Valor:
Código SQL:
Ver original
  1. DECLARE @Valor DECIMAL(12,2),
  2.         @Total DECIMAL(12,2),
  3.         @Rc INT;
  4.  
  5. SELECT  @RC=1,
  6.         @Total=0;
  7. SELECT  @Valor=MIN(Valor),
  8.         @Total=@Total+MIN(Valor)
  9. FROM    #T
  10. WHERE   Total IS NULL;
  11.  
  12. While   @Valor IS NOT NULL
  13.         BEGIN
  14.         UPDATE  T
  15.         SET     Total=@Total
  16.         FROM    (SELECT Top 1 *
  17.                 FROM    #T
  18.                 WHERE   Valor=@Valor
  19.                         AND Total IS NULL) T;
  20.         SELECT  @Valor=MIN(Valor),
  21.                 @Total=@Total+MIN(Valor)
  22.         FROM    #T
  23.         WHERE   Total IS NULL;
  24.         END
Y finalmente encontramos los valores utilizando un CTE recursivo (el resumen debe ser 14007.70 y no 14007.74):
Código SQL:
Ver original
  1. DECLARE @S2 DECIMAL(12,2);
  2. SELECT  @S2= 14007.70;
  3.  
  4. WITH T AS
  5. (SELECT Valor,
  6.         Total,
  7.         CAST(@S2-Valor AS DECIMAL(12,2)) STotal,
  8.         CAST(Valor AS VARCHAR(MAX)) SValor
  9. FROM    #T
  10. WHERE   Total>=@S2
  11. UNION ALL
  12. SELECT  T1.Valor,
  13.         T1.Total,
  14.         CAST(T.STotal-T1.Valor AS DECIMAL(12,2)),
  15.         CAST(T.SValor+','+CAST(T1.Valor AS VARCHAR(MAX)) AS VARCHAR(MAX))
  16. FROM    T
  17. INNER JOIN #T T1
  18.         ON T.Valor>=T1.Valor
  19.         AND T.Total>T1.Total
  20.         AND T.STotal<=T1.Total
  21. WHERE   T.STotal-T1.Valor>=0)
  22. SELECT  *
  23. FROM    T
  24. WHERE   STotal=0;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog