【发布时间】:2011-05-06 02:06:50
【问题描述】:
我想从SQL 2008 中的一个名为@X_Table 的表中获取3 tables(该表的列名称为original table):
原始表有很多行和 5 个属性(我可以有更多的属性,比如 30,但在示例中我有 5 个属性):
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)** ...
首先我在其他表中获取列名(the var @table_name 指上表):
INSERT @X_Table (ID,NAME)
SELECT [ID] = ORDINAL_POSITION, [NAME] = COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table_name
所以我得到了@X_Table:
@X_Table:
ID NAME
------------
1 x1
2 x2
3 x3
4 x4
5 x5
然后for each column 我想要sum of all values in that column
所以 xi 中的所有值,所以
sum(x1), sum(x2), sum(x3), sum(x4), sum(x5)`
表 1:INT、VARCHAR、FLOAT
ID Name value
---------------------------
1 x1 48431
2 x2 138420
3 x3 192071
4 x4 192041
5 x5 204602
然后for each column 我想要sum of all values in that column multiplied by each column 例如
对于第 x1 列:sum(x1*x1), sum(x1*x2), sum(x1*x3), sum(x1*x4), sum(x1*x5)
对于第 x2 列:sum(x2*x2), sum(x2*x3), sum(x2*x4), sum(x2*x5)
对于第 x3 列:sum(x3*x3), sum(x3*x4), sum(x3*x5)
对于第 x4 列:sum(x4*x4), sum(x4*x5)
对于第 x5 列:sum(x5*x5)
表 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
那么对于最后一张表,我想要对角线,或者上表的其他 xii
表 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
所以为此我正在做这种方法,但我知道这是可以优化的,
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
- 如果没有这 2 个,您将如何做到这一点 循环?,
(属性超过30个的表需要很多时间...)
--------------编辑-------------- --------------
当我为@table1 获得超过 10 列时(@Thomas 的回答)
ID 名称值
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
有没有办法按名称对它们进行排序
x1,x2,x3,x4,x5...,x9,x10,x11....
而不是
x1,x10,x11,x19,x2,x3....?
所以我们得到
ID Name Value
-----------------
1 x1 8029145
2 x2 12696346
3 x3 135818770
...
【问题讨论】:
标签: sql sql-server-2008 stored-procedures loops