3 Stimmen

3 Tabellen in SQL Server 2008 abrufen, zwei Schleifen und Dynamic SQL vermeiden

Ich möchte eine 3 tables aus einer Tabelle namens @X_Table (diese Tabelle hat die Namen der Spalten von original table ) in SQL 2008 :

Die Originaltabelle hat viele Zeilen und 5 Attribute (ich könnte mehr Attribute wie 30 haben, aber im Beispiel habe ich 5 Attribute):

x1  x2   x3   x4   x5    
----------------------------
438 498  3625 3645 5000
438 498  3625 3648 5000
438 498  3625 3629 5000
437 501  3625 3626 5000
438 498  3626 3629 5000
439 498  3626 3629 5000
440 5000 3627 3628 5000
444 5021 3631 3634 5000
451 5025 3635 3639 5000
458 5022 3640 3644 5000
465 525  3646 3670 5000
473 533  3652 3676 5000
481 544  3658 3678 5000
484 544  3661 3665 5000
484 532  3669 3662 2945
482 520  3685 3664 2952
481 522  3682 3661 2955
480 525  3694 3664 2948
481 515  5018 3664 2956
479 5000 3696 3661 2953 
**...(EVEN MORE ROWS LIKE 100,000)** ...

Zuerst erhalte ich in einer anderen Tabelle die Namen der Spalten ( the var @table_name bezieht sich auf die obige Tabelle):

INSERT  @X_Table (ID,NAME) 
SELECT  [ID] = ORDINAL_POSITION, [NAME] = COLUMN_NAME 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = @table_name

Ich erhalte also die @X_Table:

@X_Table:

ID  NAME
------------
1   x1
2   x2
3   x3
4   x4
5   x5

Dann for each column Ich möchte die sum of all values in that column also alle Werte in xi, also Summe(x1), Summe(x2), Summe(x3), Summe(x4), Summe(x5)`

Tabelle 1: INT,VARCHAR,FLOAT

ID Name  value
---------------------------
1   x1  48431
2   x2  138420
3   x3  192071
4   x4  192041
5   x5  204602

Dann for each column Ich möchte die sum of all values in that column multiplied by each column zum Beispiel
für Spalte x1: sum(x1*x1), sum(x1*x2), sum(x1*x3), sum(x1*x4), sum(x1*x5)
für Spalte x2: sum(x2*x2), sum(x2*x3), sum(x2*x4), sum(x2*x5)
für Spalte x3: sum(x3*x3), sum(x3*x4), sum(x3*x5)
für Spalte x4: sum(x4*x4), sum(x4*x5)
für Spalte x5: sum(x5*x5)

Tabelle 2: INT, VARCHAR, FLOAT

ID   Name     value
---------------------------
1   SUM(x1*x1)  83926421
2   SUM(x1*x2)  162997894
3   SUM(x1*x3)  186865166
4   SUM(x1*x4)  156224385
5   SUM(x1*x5)  168573557
6   SUM(x2*x2)  598228836
7   SUM(x2*x3)  542331010
8   SUM(x2*x4)  460990820
9   SUM(x2*x5)  512335365
10  SUM(x3*x3)  797430261
11  SUM(x3*x4)  659040569
12  SUM(x3*x5)  723779398
13  SUM(x4*x4)  677091478
14  SUM(x4*x5)  722922237
15  SUM(x5*x5)  808976398

Dann möchte ich für die letzte Tabelle die Diagonale, oder anders gesagt die xii der obigen Tabelle

Tabelle 3: INT, VARCHAR, FLOAT

ID   Name     value
---------------------------
1   SUM(x1*x1)  83926421
2   SUM(x2*x2)  598228836
3   SUM(x3*x3)  797430261
4   SUM(x4*x4)  677091478
5   SUM(x5*x5)  808976398

Um dies zu tun, wende ich diesen Ansatz an, aber ich weiß, dass er optimiert werden kann,

SET @d = 5
WHILE (@counterI <= @d) BEGIN
        SELECT @nameThird   = NAME  FROM @X_Table where ID =  @counterI;
        SET    @nameFirst   = @nameThird;

    --INSERT FIRST TABLE
    SET @queryFirst = 'INSERT #FIRST_T (ID,NAME,Value) SELECT '+ CAST(@counterI AS VARCHAR)+' , '''+@nameFirst+''', SUM('+@nameFirst+') FROM '+ @table_name;
    EXEC (@queryFirst);

    --GET VALUE TO INSERT IN THIRD TABLE       
    SET @queryThird = 'INSERT #THIRD_T (ID,NAME,Value) SELECT '+CAST(@counterI AS VARCHAR)+' , '''+@nameThird+'*'+@nameThird+''', SUM('+@nameThird +'*'+@nameThird+') FROM '+  @table_name;
    EXEC (@queryThird);

    --Xij  
    WHILE (@counterJ <= @d) BEGIN           
        SELECT @nameThird2  = NAME  FROM @X_Table where ID =  @counterJ;
        SET @queryThird = 'INSERT #SECOND_T (ID,NAME,Value) SELECT '+CAST(@n AS VARCHAR)+' , '''+@nameThird+'*'+@nameThird2+''', SUM('+@nameThird +'*'+@nameThird2+') FROM '+  @table_name;
        EXEC (@queryThird);         
        SET @counterJ  = @counterJ + 1; 
        SET @n = @n +1  
    END         
    SET @counterI   = @counterI + 1; --reduce space
    SET @counterJ   = @counterI;
END
  • Wie würden Sie das ohne diese 2 Schleifen?,

(Bei Tabellen mit mehr als 30 Attributen dauert es sehr lange...)

-----------------------------EDIT----------------------------

Wenn ich mehr als 10 Spalten habe, erhalte ich für @table1 (Antwort von @Thomas)

ID Name Wert


1   x1  8029145
2   x10 15453498
3   x11 13909514
4   x12 11336348
5   x13 11598240
6   x14 11951291
7   x15 12034693
8   x16 6558719
9   x17 5400520
10  x18 4966450
11  x19 5773049
12  x2  12696346
13  x20 5872404
14  x21 5542875
15  x22 9700954
16  x23 8484327
17  x24 8612340
18  x25 129470
19  x3  135818770 

Gibt es eine Möglichkeit, sie nach Namen zu sortieren?

x1,x2,x3,x4,x5...,x9,x10,x11.... 

anstelle von

x1,x10,x11,x19,x2,x3....?

Wir erhalten also

ID Name Value
 -----------------
    1   x1  8029145
    2   x2  12696346
    3   x3  135818770
    ...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X