2012-11-16 24 views
1

我有一個帶有索引的表,並且正在執行使用總和 的聚合SQL查詢,您可以在sqlfiddle中看到我在做什麼here如何插入到單獨的表中聚合SQL查詢的結果

Create table TX (
    i int NOT NULL PRIMARY KEY, 
    x1 DECIMAL(7,3), 
    x2 DECIMAL(7,3), 
    x3 DECIMAL(7,3) 
); 


INSERT INTO TX (i,x1,x2,x3) values 
(1,5, 6,6) ; 
INSERT INTO TX (i,x1,x2,x3) values 
(2,6, 7, 5); 
INSERT INTO TX (i,x1,x2,x3) values 
(3,5, 6, 7) ; 
INSERT INTO TX (i,x1,x2,x3) values 
(4,6, 7, 4); 

我的問題是如何將該查詢的結果插入到3個不同的表中?

SELECT SUM(1), 
     SUM(x1),SUM(x2),SUM(x3), 
     SUM(x1*x1), 
     SUM(x2*x1),SUM(x2*x2), 
     SUM(x3*x1),SUM(x3*x2),SUM(x3*x3) 

FROM TX 

所以

?我怎樣才能像

Sum(1) 
----- 
n 

index Sums 
------------ 
1  4 
2  22 
3  26 

index1 index2 Mult 
---------------------- 
1   1 122 
2   1 144 
2   2 170 
3   1 119 
3   2 141 
3   3 126 

而不是

SUM(1) SUM(X1) SUM(X2) SUM(X3) SUM(X1*X1) SUM(X2*X1) SUM(X2*X2) SUM(X3*X1) SUM(X3*X2) SUM(X3*X3) 
_____________________________________________________________________________________________________ 
     4  22  26  22  122  144  170  119   141   126 

回答

2
SELECT SUM(1) 
FROM TX; 

SELECT 1, SUM(x1) 
FROM TX 
UNION ALL 
SELECT 2, SUM(x2) 
FROM TX 
UNION ALL 
SELECT 3, SUM(x3) 
FROM TX; 

SELECT a.x i1, b.x i2, SUM(a.s * b.s) 
FROM 
(
    SELECT i, 1 x, x1 s 
    FROM TX 
    UNION ALL 
    SELECT i, 2 x, x2 s 
    FROM TX 
    UNION ALL 
    SELECT i, 3 x, x3 s 
    FROM TX 
) a 
INNER JOIN 
(
    SELECT i, 1 x, x1 s 
    FROM TX 
    UNION ALL 
    SELECT i, 2 x, x2 s 
    FROM TX 
    UNION ALL 
    SELECT i, 3 x, x3 s 
    FROM TX 
) b ON a.i = b.i AND a.x >= b.x 
GROUP BY a.x, b.x; 

SQL Fiddle using your data - 請注意,您的數據的總和(第二查詢)不與你的問題相匹配ñ。我相信這是一個錯字。

注意我對第三個查詢有點慵懶。我沒有寫出擴展名,而是先把桌子放平,然後自己加入。

另請注意,在第一個查詢SUM(1)可以替換爲COUNT(*)

+0

恐怕是不正確,對於爲例e看看SUM(x3 * x3)和126是不一樣的,你的是484 – cMinor

+0

啊,對不起,我想你想要的產品的總和,而不是產品的總和 –

+0

@cMinor好吧我修復了我的第三個查詢 –

3

運行3個單獨的查詢。將SELECT轉換爲INSERT取決於RDBMS。對於SQL Server,只需在FROM子句前面添加一個INTO newTableName即可在SELECT語句之前創建一個新子句或INSERT INTO existingTableName

Create table TX (
    i int NOT NULL PRIMARY KEY, 
    x1 DECIMAL(7,3), 
    x2 DECIMAL(7,3), 
    x3 DECIMAL(7,3) 
); 


INSERT INTO TX (i,x1,x2,x3) values 
(1,5, 6,6) ; 
INSERT INTO TX (i,x1,x2,x3) values 
(2,6, 7, 5); 
INSERT INTO TX (i,x1,x2,x3) values 
(3,5, 6, 7) ; 
INSERT INTO TX (i,x1,x2,x3) values 
(4,6, 7, 4); 

查詢1

SELECT COUNT(*) AS SUM1 
FROM TX 

Results

| SUM1 | 
-------- 
| 4 | 

查詢2

SELECT SUM(X1) index1, SUM(X2) sums 
FROM TX 

Results

| INDEX1 | SUMS | 
----------------- 
|  22 | 26 | 

查詢3

SELECT x.index1, 
     x.index2, 
     case x.id 
     when 1 then SUM(x1*x1) 
     when 2 then SUM(x2*x1) 
     when 3 then SUM(x2*x2) 
     when 4 then SUM(x3*x1) 
     when 5 then SUM(x3*x2) 
     when 6 then SUM(x3*x3) 
     end Mult 
FROM TX 
CROSS JOIN 
    (select 1 id, 1 index1, 1 index2 union all 
     select 2 id, 2 index1, 1 index2 union all 
     select 3 id, 3 index1, 1 index2 union all 
     select 4 id, 2 index1, 2 index2 union all 
     select 5 id, 3 index1, 2 index2 union all 
     select 6 id, 3 index1, 3 index2) x 
GROUP BY x.id, x.index1, x.index2 
ORDER BY x.id 

Results

| INDEX1 | INDEX2 | MULT | 
-------------------------- 
|  1 |  1 | 122 | 
|  2 |  1 | 144 | 
|  3 |  1 | 170 | 
|  2 |  2 | 119 | 
|  3 |  2 | 141 | 
|  3 |  3 | 126 | 
+0

是否有在同一個查詢中這樣做的方法可能是創建一個VIEW然後執行一個查詢 – cMinor

+0

您無法爲每個查詢生成*多個*結果集?! – RichardTheKiwi

+0

這隻能在像原始這樣的大查詢中進行嗎? – cMinor

相關問題