【问题标题】:How to insert into separate tables result of aggregate SQL query如何将聚合 SQL 查询的结果插入单独的表中
【发布时间】:2012-11-04 18:03:05
【问题描述】:

我有一个带有索引的表,我正在使用 sum 执行聚合 SQL 查询 你可以在 sqlfiddle 中看到我在 here 在做什么。

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

【问题讨论】:

    标签: sql aggregate-functions


    【解决方案1】:
    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(*)

    【讨论】:

    • 恐怕不正确,比如看SUM(x3*x3)和126不一样,你的是484
    • 啊,对不起,我错过了你想要乘积的总和,而不是总和的乘积
    • @cMinor 好的,我修复了第三个查询
    【解决方案2】:

    运行 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 |
    

    【讨论】:

    • 有没有办法在同一个查询中这样做,可能创建一个 VIEW 然后执行一个查询
    • 您不能为每个查询生成 多个 个结果集?!
    • 这只有在像原始这样的大型查询中才有可能?
    • 在 SQL Server 中,您可以创建一个执行 3 次选择的过程。但它不是view,它只是一个存储的查询定义。不过,它需要一些前端处理来遍历单独的结果集。
    • 我不明白你的最后一个问题。这是一个新问题吗?我没有得到对 10/3 列的引用。
    猜你喜欢
    • 2013-12-25
    • 2013-04-28
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多