2016-03-31 4 views
1

In SQL 2008, ich bin auf der Suche nach einer Möglichkeit, alle 0s oben, dass auf den nächsten Wert zu konvertieren 0 ist nicht Grundsätzlich ich dies wollen:Wenn ein Tabellenwert 0 ist, wie kann ich den nächst höheren Wert, der nicht 0 ist, auswählen?

+--------+-------+ 
| Number | Cost | 
+--------+-------+ 
|  1 | 5.84 | 
|  2 | 0.00 | 
|  3 | 0.00 | 
|  4 | 0.00 | 
|  5 | 0.00 | 
|  6 | 5.98 | 
|  7 | 0.00 | 
|  8 | 0.00 | 
+--------+-------+ 

Um wie folgt aussehen:

+--------+-------+ 
| Number | Cost | 
+--------+-------+ 
|  1 | 5.84 | 
|  2 | 5.84 | 
|  3 | 5.84 | 
|  4 | 5.84 | 
|  5 | 5.84 | 
|  6 | 5.98 | 
|  7 | 5.98 | 
|  8 | 5.98 | 
+--------+-------+ 

Das Problem ist, eine Schleife ist super Besteuerung, da ich dies auf Tausende von Werten tun muss. Hier ist die Schleife, die ich versucht habe:

WHILE (SELECT COUNT(*) FROM #table WHERE cost is null) > 0 

    BEGIN 

     UPDATE TOP (1) #table 
     SET cost = ((select cost from #table t2 where (f2.number = #table.number + 1))) 
     WHERE cost = 0 

    END 

Irgendwelche Ideen Jungs?

+0

Sie sind viel besser dran, zuerst mit der Ergebnismenge arbeiten, dann stellen Sie die Daten zu ziehen. – durbnpoisn

+0

Was meinst du genau? – Steven

+0

Es ist schwer zu sagen, weil uns der Kontext fehlt, aber es sieht wie ein zutiefst fehlerhaftes Schemadesign aus, in dem Sie (mindestens) eine zusätzliche Spalte in dieser Tabelle haben sollten. –

Antwort

1
CREATE TABLE #numbers (number INT, cost DECIMAL(10, 3)) 

INSERT INTO #numbers 
     (number, cost) 
VALUES 
(  1 , 5.84 ), 
(  2 , 0.00 ), 
(  3 , 0.00 ), 
(  4 , 0.00 ), 
(  5 , 0.00 ), 
(  6 , 5.98 ), 
(  7 , 0.00 ), 
(  8 , 0.00 ) 



UPDATE #numbers 
SET cost = (SELECT TOP 1 m.cost FROM #numbers m WHERE cost > 0 AND n.number > m.number 
    ORDER BY m.number desc 
) 
FROM #numbers n 
WHERE cost = 0 

SELECT * FROM #numbers 


DROP TABLE #numbers 
1
update #table set cost = (
    select top 1 cost 
    from #table t2 
    where t2.number < #table.number 
    and t2.cost <> 0 
    order by number desc 
) 
where cost = 0 
0

Ihre Tabellennamen Unter der Annahme, Tabelle 1, Diese Abfrage:

update table1 set Cost = 
    case when Cost <> 0 then Cost 
    else (select top 1 Cost from table1 t2 
     where t2.Cost <> 0 and t2.Number < table1.Number 
     order by table1.Number desc) 
    end 
from table1