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

Oracle枢轴中的列

长孙昀
2023-03-14
问题内容

示例选择:

select *
from (
    select 1 cnt, 2 sm, '55' name, 12 month, 2011 year, '12 2011' mnth_txt from dual union all
    select 1 cnt, 2 sm, '54' name, 11 month, 2011 year, '11 2011' mnth_txt from dual union all
    select 1 cnt, 2 sm, '55' name, 11 month, 2011 year, '11 2011' mnth_txt from dual union all
    select 1 cnt, 2 sm, '54' name, 12 month, 2011 year, '12 2011' mnth_txt from dual union all
    select 1 cnt, 2 sm, '55' name, 12 month, 2011 year, '12 2011' mnth_txt from dual union all
    select 1 cnt, 2 sm, '56' name, 12 month, 2010 year, '12 2010' mnth_txt from dual  
) pivot (
    sum(cnt) cnt, sum(sm) sm
    for name in
            ( '55' as "Omsk"
            , '54' as "Novosibirsk"
            , '56' as "Orenburg"
            )
)

输出:

|month| year | mnth_txt |Omsk_cnt|Omsk_sm|Novosibirsk_cnt|Novosibirsk_sm|Orenburg_cnt| Orenburg_sm|
| 12  | 2010 |'12 2010' | (null) | (null)| (null)        | (null)       | 1          | 2          |
| 12  | 2011 |'12 2011' | 2      | 4     | 1             | 2            | (null)     | (null)     |
| 11  | 2011 |'11 2011' | 1      | 2     | 1             | 2            | (null)     | (null)     |

是否可以按时间顺序对记录进行排序,排除列“月”和“年”?没有列出所有列。

UPD

需要:

| mnth_txt |Omsk_cnt|Omsk_sm|Novosibirsk_cnt|Novosibirsk_sm|Orenburg_cnt| Orenburg_sm|
|'12 2010' | (null) | (null)| (null)        | (null)       | 1          | 2          |
|'11 2011' | 1      | 2     | 1             | 2            | (null)     | (null)     |
|'12 2011' | 2      | 4     | 1             | 2            | (null)     | (null)     |

就像是:

select mnth_txt, pivoted_columns.*

问题答案:

要对记录进行排序,可以将以下内容添加到sql的末尾

ORDER BY TO_DATE('01/'||month||'/'||year,'dd/mm/yyyy')

注意:枢轴列名称区分大小写,因此需要用引号引起来

这是完整的查询,仅选择您需要的列:

 SELECT mnth_txt,"Omsk_CNT","Omsk_SM","Novosibirsk_CNT",
        "Novosibirsk_SM","Orenburg_CNT","Orenburg_SM" 
 FROM
 (
 SELECT *
 FROM (     
  SELECT 1 cnt, 2 sm, '55' name, 12 month, 2011 year, '12 2011' mnth_txt FROM DUAL UNION ALL     
  SELECT 1 cnt, 2 sm, '54' name, 11 month, 2011 year, '11 2011' mnth_txt FROM DUAL UNION ALL    
  SELECT 1 cnt, 2 sm, '55' name, 11 month, 2011 year, '11 2011' mnth_txt FROM DUAL UNION ALL     
  SELECT 1 cnt, 2 sm, '54' name, 12 month, 2011 year, '12 2011' mnth_txt FROM DUAL UNION ALL     
  SELECT 1 cnt, 2 sm, '55' name, 12 month, 2011 year, '12 2011' mnth_txt FROM DUAL UNION ALL     
  SELECT 1 cnt, 2 sm, '56' name, 12 month, 2010 year, '12 2010' mnth_txt FROM DUAL   ) 
  PIVOT ( SUM(cnt) cnt, SUM(sm) sm     
          FOR NAME IN             
          ( '55' AS "Omsk",'54' AS "Novosibirsk", '56' AS "Orenburg" ) 
        )
  ORDER BY TO_DATE('01/'||month||'/'||year,'dd/mm/yyyy')         
 )


 类似资料:
  • 问题内容: 我有一张这样的产品零件表: 部分 我想要一个查询,将返回这样的表: 在其实际实施中,将有数百万个产品零件 问题答案: 不幸的是,MySQL没有函数,但是您可以使用聚合函数和语句对其进行建模。对于动态版本,您将需要使用准备好的语句: 请参见带有演示的SQL Fiddle 如果只有几列,则可以使用静态版本:

  • 我在使用PIVOT SQL脚本时遇到了一个“小”问题。我目前的解决方案基于类似的问题 动态枢轴 . 我已经写好了PIVOT脚本,基本上没问题。然而,我的情况是这样的,脚本输出类似这样的内容,而不是将唯一的条目放在单行上 而我所寻找的结果应该是这样的 这是脚本 我将不胜感激一些可以帮助我解决这个问题的指示。我在这里做了一个小提琴,由于某种奇怪的原因,它没有输出任何东西,但生成架构的所有代码都在那里

  • 问题内容: 如何执行枢纽功能 我有一张有数据的表 但我需要的格式为 这样。 如何执行数据透视功能以这种格式获取。 请帮帮我........ 我用过我的查询 结果显示为 但在这里我也有3个星期一的记录,而不是一个星期一的记录… 如何获得每天1天的一个记录…? 问题答案: 试试这个: PIVOT运算符未“消耗”的任何列将保留在最终结果集中,从而增加了基数。

  • 问题内容: 我有一个简单的查询,像这样。 一个简单的枢轴给了我 给我 但是数据透视查询中的值是硬编码。我想从子查询中获取这些值。 但是,pivot不允许我从子查询中获取值,除了编写动态生成的查询之外,还有其他方法可以执行此操作吗? 问题答案: 不能。只能使用动态查询来完成。我真的很想知道是否有办法。

  • 问题内容: 好吧,我有一张看起来像这样的表 现在,我需要将其转换为: 我一直在看动态透视图示例,但是我似乎无法使其适合我的情况。 有人可以帮忙吗? 问题答案: 看下面的例子