2016-07-08 6 views
0

Ich habe eine Tabelle mit dem Namen PriceDetails mit drei Spalten "price","discount formula" and "finalprice". Ich muss den endgültigen Preis basierend auf "Price" and "discount formula" Spalten berechnen.Ausdrücken Ausdruck in Varchar Spalte direkt in der "Select" -Anweisung

Meine Tabelle sieht wie folgt aus,

Price DiscountFormulae 
100  100*(3/100) 
200  200*(1.1/100)+200*(5/100) 
300  300*(1/100)+300*(3/100)+300*(2/100) 
400  400*(7/100)+400*(6.6/100)+400*(5.5/100)+400*(4/100) 

I Endpreis berechnet werden soll. (100 * (3/100)) = 97

Meine Erwartete Ausgabe

Price DiscountFormulae FinalPrice 
100  100*(3/100)   97 

Note: My DiscountFormulae Column is Varchar(1000) 

wäre Wie kann ich diese bekommen - Die Formel würde "Price"-"DiscountFormulae"

zum Beispiel

100 sein. Bitte hilf mir.

+0

Das Speichern einer Berechnung in einer Textspalte ist kein großartiges Design und bedeutet, dass Sie sich für Laufzeitfehler öffnen. Wie wäre es, wenn Sie eine DiscountAmount-Spalte (numerisch) erstellen und das Ergebnis Ihrer Berechnung in die Spalte, d. H. 3 in Ihrem Beispiel, einfügen. –

Antwort

1

Nicht sehr gute Lösung, aber es zeigt, wie schwierig es ist:

CREATE TABLE #temp (Price int, DiscountFormula Varchar(1000)) 
INSERT INTO #temp 
(#temp.Price, #temp.DiscountFormula) 
VALUES 
(100,'100.0*(3.0/100)'), 
(200,'200.0*(1.1/100)+200*(5.0/100)'), 
(300,'300.0*(1.0/100)+300*(3.0/100)+300*(2.0/100)'), 
(400,'400.0*(7.0/100)+400*(6.6/100)+400*(5.5/100)+400*(4.0/100)') 

DECLARE @price int 

DECLARE cur CURSOR FOR SELECT t.Price FROM #temp AS t 
OPEN cur 
FETCH NEXT FROM cur INTO @price 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 

    DECLARE @sql nvarchar(MAX) = N' 
    SELECT 
     t.Price, 
     t.DiscountFormula, 
     ' + (SELECT TOP 1 DiscountFormula FROM #Temp WHERE Price = @price) + N' as Value 
    FROM #temp AS t 
    WHERE Price = ' +CONVERT(nvarchar(max),@price) 

    EXEC sp_executesql @sql 

    FETCH NEXT FROM cur INTO @price 
END 

CLOSE cur 

DROP TABLE #temp 

By the way, Verwendung Float-Werte in der Formel.

+0

Danke für Ihre schnelle Antwort. Ich weiß, wie man das in einer Schleife macht. Ist eine Möglichkeit, eine einzelne dynamische Auswahl ohne Schleife vorzubereiten. – StackUser

+0

Danke für Ihre Mühe. Ich werde abstimmen. Bitte sagen Sie mir irgendeinen anderen satzbasierten Ansatz, abgesehen von loop. – StackUser

+0

@StackUser Ich fürchte, ich kenne keinen besseren Weg – Backs

0

Man könnte es in einer gespeicherten Prozedur tun, wie:

Aber dynamische SQL, wie exec oder sp_executesql wird in benutzerdefinierten Funktionen nicht erlaubt.

DECLARE @calc varchar(max) 
SET @calc = '100*(3/100)' 

DECLARE @sql nvarchar(max) 
DECLARE @result float 
SET @sql = N'SET @result = ' + @calc 
exec sp_executesql @sql, N'@result float output', @result out 
SELECT @result 
+0

Ich kenne diesen Ansatz. Ich muss das gleiche für jede Zeile innerhalb der gespeicherten Prozedur tun. Ist eine Möglichkeit, dies direkt in Select-Anweisung selbst zu tun – StackUser

+0

@StackUser Sie können es nicht in Single Select-Anweisung tun. Sie müssen SP dafür verwenden –