2016-08-29 1 views
-1

Ich habe 3 Zeilen mit Daten und möchte den Wert zwischen den Zeilen hinzufügen. In Excel kann ich die Excel-Formel verwenden und manuell erstellen, aber ich möchte es in SQL erstellen. Das erwartete Ergebnis wie das Bild ist:SQL-Wert zwischen den Zeilen generieren

enter image description here

In der Abbildung ist F3 den Mittelwert zwischen 1 und ID 2 und teilen sie auf 10 zu erhalten, nachdem den Mittelwert erhalten, verwendet den ersten Wert in E3 und addieren Sie Wert F3, und erhalten Sie 1.271111. E5 benutze E4 addiere den Wert F3 und so weiter.

Ich möchte zusätzliche 10 Zeilen zwischen verschiedenen ID, und Basis auf den Differenzwert zwischen ID, summiere den vorherigen Wert mit dem Differenzwert. Ist es nicht möglich, dies in einer SQL-Anweisung zu tun?

+0

Erstens kann man keine 'NULL' ID haben! Sie können Daten hinzufügen. möglicherweise duplizieren von http://stackoverflow.com/questions/9177177/how-to-insert-a-row-in-a-table-between-two-existing-rows-in-sql – Smit

+0

Bitte erwähnen Sie, was genau Ihr Excel-Blatt Formel macht. SQL Server unterstützt keine ungültigen/doppelten IDs. Wenn ID-Spalte nicht eine ID/Primärschlüssel und nur eine Spalte sein soll, könnte es möglich sein. Entschuldigung, aber "-1" als Frage ist nicht richtig eingerahmt. –

+1

Vielleicht bedeutete Arzozeus, dass SELECT-Ergebnisse zusätzliche 10 Zeilen zwischen jeder ID zurückgeben sollten. Es geht also nicht um das Hinzufügen der ursprünglichen Tabelle, sondern darum, die erwarteten Ergebnisse der Abfrage anzuzeigen (die dann zu einer anderen Tabelle hinzugefügt werden kann). – Anton

Antwort

2

Ich bin verwirrt über Ihren Durchschnitt.

SELECT (10 - 0.18)/9 -- 1.091111 -- This is your average? 
-- 
SELECT (10 - 0.18)/10 -- 0.982000000 
SELECT (32.11 - 10)/10 -- 2.211000 

Sie können als unten:

DECLARE @Tbl TABLE (Id INT, Value DECIMAL(7, 5)) 
INSERT INTO @Tbl   
VALUES 
(1, 0.18), 
(2, 10), 
(3, 32.11) 

;WITH CTE 
AS 
(
    SELECT 
     Id , 
     Value, 
     COALESCE((LEAD(Value) OVER (ORDER BY Id) * 1.0 - Value * 1.0)/10, 0) AS AverageValue 
    FROM @Tbl 
) 

--SELECT (10 - 0.18)/10 -- 0.982000000 
--SELECT (32.11 - 10)/10 -- 2.211000 

SELECT DISTINCT 
    A.Id, 
    COALESCE((B.RowId * 1.0 * A.AverageValue) + A.Value,0) AS Result 
FROM 
    CTE A CROSS JOIN 
    (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) B(RowId) 

Hinweis: Dies ist für 2012+

1

Sie müssen rekursive CTE:

;WITH YourTable AS (--simulation of your table 
    SELECT * FROM (VALUES (1,0.18),(2,10),(3,32.11)) as t(Id,[Value]) 
), cte AS (--Don't know what version of SQL Server you are using 
    SELECT a.ID, --so I use OUTER APPLY to get next string value 
      cast(a.[Value] as float) [Value], 
      ISNULL(CAST((b.[Value]-a.[Value])/10 as float),0.00) as Seq 
    FROM YourTable a 
    OUTER APPLY (
     SELECT TOP 1 * 
     FROM YourTable 
     WHERE a.ID < ID 
     ORDER BY ID ASC 
     ) b 
), final AS (
    SELECT c.ID, 
      c.[Value], 
      c.Seq 
    FROM cte c 
    UNION ALL 
    SELECT CASE WHEN f.[Value]+f.Seq = c.[value] THEN c.id ELSE f.id END, 
      f.[Value]+f.Seq, 
      CASE WHEN ROUND(f.[Value]+f.Seq,2) = ROUND(c.[value],2) THEN c.Seq ELSE f.Seq END 
    FROM final f 
    INNER JOIN cte c 
     ON c.ID = f.ID+1 and 
      ROUND(f.[Value]+f.Seq,2) < ROUND(c.[value],2) 
    WHERE f.seq > 0 
) 

SELECT ROW_NUMBER() OVER (ORDER BY [Value]) as ID, 
     [Value], 
     Seq 
FROM final 
ORDER BY id,[Value] 
OPTION (MAXRECURSION 200) 

Ausgang:

ID Value Seq 
1 0,18 0,982 
2 1,162 0,982 
3 2,144 0,982 
4 3,126 0,982 
5 4,108 0,982 
6 5,09 0,982 
7 6,072 0,982 
8 7,054 0,982 
9 8,036 0,982 
10 9,018 0,982 
11 10  2,211 
12 12,211 2,211 
13 14,422 2,211 
14 16,633 2,211 
15 18,844 2,211 
16 21,055 2,211 
17 23,266 2,211 
18 25,477 2,211 
19 27,688 2,211 
20 29,899 2,211 
21 32,11 0 
Verwandte Themen