首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态sql,如何将查询结果保存到新的表中?

动态sql,如何将查询结果保存到新的表中?
EN

Stack Overflow用户
提问于 2014-03-27 20:05:35
回答 2查看 1.9K关注 0票数 0

下面是我的表结构,我想将其转换为另一种格式(从行类型转换为列类型:

代码语言:javascript
复制
StudentID | Mark | Subject
-------------------------
10        |46    |Java
--------------------------
10        |65    |C#
--------------------------
10        |79    |JavaScript
---------------------------
11        |66    |Java
--------------------------
11        |85    |C#
--------------------------
11        |99    |JavaScript
--------------------------

我需要它像这样

代码语言:javascript
复制
StudentID | Java | C# | JavaScript
---------------------------------
10        |  46  | 65 |   79
---------------------------------
11        |  66  | 85 |  99
-------------------------------

我编写了一个动态SQL查询来透视我的表:

代码语言:javascript
复制
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when subject = ''',
      subject,
      ''' then mark else 0 end) AS `',
      subject, '`'
    )
  ) INTO @sql
FROM  yourtable;

SET @sql = CONCAT('SELECT studentid, ', @sql, ' 
                  from yourtable
                  group by studentid');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我的问题是:如何将结果保存到另一个表中?

EN

回答 2

Stack Overflow用户

发布于 2014-03-27 20:14:20

对于透视结果,请尝试执行以下操作:

代码语言:javascript
复制
select 
    StudentId,
    max(case Subject when 'Java' then Mark end) as 'Java', 
    max(case Subject when 'C#' then Mark end) as 'C#',
    max(case Subject when 'JavaScript' then Mark end) as 'JavaScript'
from
    marks_table
group by StudentId

要将输出插入到其他表中,请使用INSERT INTO ... SELECT...中的正确语法。

代码语言:javascript
复制
insert into target_table( col1, col2, ... )
select 
    StudentId,
    max(case Subject when 'Java' then Mark end) as 'Java', 
    max(case Subject when 'C#' then Mark end) as 'C#',
    max(case Subject when 'JavaScript' then Mark end) as 'JavaScript'
from
    marks_table
group by StudentId

修改‘插入...`并相应地使用。

编辑

在动态创建的查询中

更改

代码语言:javascript
复制
SET @sql = CONCAT('SELECT studentid, ', @sql, ' 
                  from yourtable
                  group by studentid');

到的

代码语言:javascript
复制
SET @insert_query = CONCAT( 'insert into target_table_name( ' );
SET @insert_query = CONCAT( @insert_query, 'col1, col2, col3, ... ) ' );

SET @sql = CONCAT( @insert_query, 'SELECT studentid, ', @sql, ' 
                  from yourtable
                  group by studentid');

编辑2:

如果想要从准备好的@sql select语句创建新的表pivot,可以将其与create table pivot as @sql一起使用。

示例:

代码语言:javascript
复制
set @sql := concat( 'create table pivot as ', @sql );

select @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

执行完上述代码后,运行以下语句,以查看sql引擎如何将列名及其数据类型声明为default。

代码语言:javascript
复制
mysql> desc pivot;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| studentid  | int(11)       | YES  |     | NULL    |       |
| Java       | decimal(32,0) | YES  |     | NULL    |       |
| C#         | decimal(32,0) | YES  |     | NULL    |       |
| JavaScript | decimal(32,0) | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
4 rows in set (0.08 sec)

mysql> select * from pivot;
+-----------+------+------+------------+
| studentid | Java | C#   | JavaScript |
+-----------+------+------+------------+
|        10 |   46 |   65 |         79 |
|        11 |   66 |   85 |         99 |
+-----------+------+------+------------+
2 rows in set (0.00 sec)

mysql> show create table pivot\G
*************************** 1. row ***************************
       Table: pivot
Create Table: CREATE TABLE `pivot` (
  `studentid` int(11) DEFAULT NULL,
  `Java` decimal(32,0) DEFAULT NULL,
  `C#` decimal(32,0) DEFAULT NULL,
  `JavaScript` decimal(32,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

示例@

票数 1
EN

Stack Overflow用户

发布于 2014-03-27 20:11:22

编辑->我为MSSQL Server提供了答案,而不是MYSQL...

Ravinder在他的答案(投票)中是正确的。

很抱歉,如果任何人在MSSQL服务器上遇到此问题,请参考:

代码语言:javascript
复制
SELECT * into newtable FROM
( SELECT
    StudentId,
    max(case Subject when 'Java' then Mark end) as 'Java', 
    max(case Subject when 'C#' then Mark end) as 'C#',
    max(case Subject when 'JavaScript' then Mark end) as 'JavaScript'
from
    oldtable
group by StudentId) as importvalues;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22687098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档