当前位置: 首页 > 面试题库 >

转置查询输出

宗政霄
2023-03-14
问题内容

我有一个普通的选择查询,其结果如下输出。

select cid,x1,x2,x3,x4,fy
  from temp_table;

cid     x1  x2  x3  x4  fy
----------------------------
6657    100 0   0   200 2014
6658    300 0   0   400 2015
6659    500 0   0   600 2016

我希望它重写输出以下输出。

    2014    2015    2016    
-------------------------   
x1  100     300     500     
x2  0       0       0       
x3  0       0       0       
x4  200     400     600

如何做到这一点?


问题答案:

这是仅通过子查询和聚合来完成此操作的一种方法:

select name,
       sum(case when fy = 2014 then x end) as "2014",
       sum(case when fy = 2015 then x end) as "2015",
       sum(case when fy = 2016 then x end) as "2016"
from (select fy,
             (case when n.n = 1 then 'x1'
                   when n.n = 2 then 'x2'
                   when n.n = 3 then 'x3'
                   when n.n = 4 then 'x4'
              end) as name,
             (case when n.n = 1 then x1
                   when n.n = 2 then x2
                   when n.n = 3 then x3
                   when n.n = 4 then x4
              end) as x
      from temp_table cross join
            (select 1 as n from dual union all
             select 2 from dual union all
             select 3 from dual union all
             select 4 from dual
            ) n
     ) t
group by name;

您也可以使用pivot,但这是Oracle SQL的最新功能,因此我倾向于使用此方法。



 类似资料:
  • 问题内容: 我的数据库中有一个表,我想运行一个查询,例如 但我希望mysql返回utf8编码。在mysql中有任何功能可以执行此类任务吗?那是什么? 问题答案: 您可以使用CAST和CONVERT在不同类型的编码之间切换。参见:http : //dev.mysql.com/doc/refman/5.0/en/charset- convert.html

  • 问题内容: 我有一个简单的查询,它产生以下结果: 我想将行转置为列。 我了解mysql没有枢轴功能,因此需要工会,但不能100%确定。 先谢谢您的帮助。 问题答案: 您可以使用这样的交叉表来做到这一点- 另外,您应该将transporttype值移动到查找表中,并在该表中包含transporttype_id。

  • 确保你连接上了服务器,如在先前的章节讨论的。连接上服务器并布代表选择了任何数据库,但这样就可以了。知道关于如何查询的基本知识,比马上跳至创建表、给他们装载数据并且从他们检索数据更重要。本节描述输入命令的基本原则,使用几个查询,你能尝试了解mysql是如何工作的。 这是一个简单的命令,要求服务器告诉它的版本号和当前日期。在mysql>提示输入如下命令并按回车键: mysql> SELECT VERS

  • 我有一个名为TEST的表,列名为col1、col2、col3、col4。。。。。。。。。。所以,从信息模式来看。列我将获得有关此表对象的详细信息。 现在,我想通过从信息_模式中提供列名称,从测试表中构建一个select查询。柱。像这样,从information_schema中选择column_name。表_name='TEST'中的列。这会回来的 col1 col2 col3 我想在selectq

  • 问题内容: 可以单身吗? 我的意思是转储 整个 数据库,就像导出到 问题答案: 不是mysqldump,而是mysql cli … 您可以根据需要将其重定向到文件中: 更新:原始帖子询问他是否可以通过查询从数据库中转储。他问的和他的意思是不同的。他真的只想mysqldump所有表。

  • 问题内容: 我在表上有这些数据(使用SQL Server 2005): 我想将其转换为: 现在最困难的部分是:假设我没有其他数据字段指定哪个记录是早餐,午餐或晚餐。我想将它们与最短的开始时间相关联,即,开始时间越短将是早餐,其次就越是午餐,晚餐就越高(假设所有三个(并且只有三个)记录总是被填充)。 有任何想法吗? 问题答案: