2015-11-20 70 views
1

您可以請幫助在SQL Server中實現以下公式嗎?我現在很困惑。在SQL中實現自定義公式

這裏的表:

| Row Number | Column Number L | Column Number M | Colum Number Z  |      Formula     | 

|  117 | 11.98   | 12.34141   | 0.3614100028772230000 | L117*(Z117)        | 
|  368 | 14.3   | 14.789574  | 0.056470999155824700 | L368*(Z368)-((M117-L117)*(M368/M117))  | 
|  620 | 13.45   | 14.034546  | 0.119965883942196000 | L620*(Z620)-((M368-L368)*(M620/M368))  | 
|  869 | 15.78   | 16.731183  | 0.254320519446635000 | L869*(Z869)-((M620-L620)*(M869/M620))  | 
|  1125 | 20.4   | 22.690612  | 1.000629762258830000 | L1125*(Z1125)-((M869-L869)*(M1125/M869)) | 
|  1376 | 20.85   | 25.478565  | 2.056509721684180000 | L1376*(Z1376)-((M1125-L1125)*(M1376/M1125)) | 
+------------+-----------------+------------------+-----------------------+---------------------------------------------+ 
+0

使用'case'表達式 –

+1

這是沒有意義的表如何表示這樣做。我建議使用excel,因爲這看起來更像是一張電子表格,而不是一張表格。 – Dane

+0

正確我從電子表格中複製了數據,但是我必須在SQL中實現邏輯,因爲我從表格中提取數據,所以我很困惑。 – user1143726

回答

1

如果你碰巧使用SQL Server 2012+可以使用LAG幫助您獲得您需要爲您的計算值。

由於第一行與其餘行不同,因此可以使用case語句來獲取其值並將其他值分開。

測試數據:

CREATE TABLE Table1 
    ([Row] int, [L] int, [M] int, [Z] float) 
; 

INSERT INTO Table1 
    ([Row], [L], [M], [Z]) 
VALUES 
    (117, 11.98, 12.34141, 0.3614100028772230000), 
    (368, 14.3, 14.789574, 0.056470999155824700), 
    (620, 13.45, 14.034546, 0.119965883942196000), 
    (869, 15.78, 16.731183, 0.254320519446635000), 
    (1125, 20.4, 22.690612, 1.000629762258830000), 
    (1376, 20.85, 25.478565, 2.056509721684180000) 
; 

查詢:

SELECT 
    [Row], 
    L, 
    M, 
    Z, 
    CASE WHEN t.Rn = 1 THEN L * Z 
    ELSE L * Z - ((PrevM-PrevL) * (M/PrevM)) END Formula 
FROM 
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY [Row]) Rn, 
     LAG(L) OVER (ORDER BY [Row]) PrevL, 
     LAG(M) OVER (ORDER BY [Row]) PrevM, 
     LAG(Z) OVER (ORDER BY [Row]) PrevZ 
    FROM Table1 
) t 

對於SQL 2008,你可以使用子查詢和ROW_NUMBER得到相同的結果。

SELECT 
    curr.[Row], 
    curr.L, 
    curr.M, 
    curr.Z, 
    CASE WHEN curr.Rn = 1 THEN curr.L * curr.Z 
    ELSE curr.L * curr.Z - ((prev.M-prev.L) * (curr.M/prev.M)) END Formula 
FROM 
    (SELECT *, ROW_NUMBER() OVER (ORDER BY [Row]) Rn FROM Table1) curr 
    LEFT JOIN (SELECT *, ROW_NUMBER() OVER (ORDER BY [Row]) + 1 Rn FROM Table1) prev ON curr.Rn = prev.Rn 
+0

非常感謝..你讓我的一天..真的很感謝你的快速幫助.. – user1143726