惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
L
LINUX DO - 热门话题
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Cisco Talos Blog
Cisco Talos Blog
AI
AI
L
LINUX DO - 最新话题
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The GitHub Blog
The GitHub Blog
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
S
Securelist
博客园_首页
IT之家
IT之家
Schneier on Security
Schneier on Security
博客园 - 叶小钗
罗磊的独立博客
WordPress大学
WordPress大学
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
W
WeLiveSecurity
The Register - Security
The Register - Security
D
DataBreaches.Net
S
Security @ Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
Recorded Future
Recorded Future
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tailwind CSS Blog
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
T
Tor Project blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - LiuLei

[转]oracle RAC 日志体系 [转]Oracle10g RAC crsctl&srvctl [转]oracle v$sqlarea 分析SQL语句使用资源情况 SQL2008数据库还原后显示受限制用户解决办法 [转].net 连接oracle的几种方式 [转]日常养生:按摩七大养生穴位 让你百毒不侵! [转]两个长寿穴合谷与内关 [原]C#错误解决-"Window无法访问指定设备,路径或文件..." [转]WeifenLuo.WinFormsUI.Docking——DockPanel的一点点改进 [转]VS2010 项目引用了DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称 [原]升级sqlserver2008 r2的错误:perf-ReportServer-rsctr.dll被使用 [原]安装SQL SERVER2008错误:Microsoft.SqlServer.Configuration.LandingPage.Properties.Settings [原]卸载mssqlserver2008R2并重新安装 [原] sqlserver2008 还原数据库出现错误:3154 [转]【C#】Color颜色对照表 [转]关于本博客数据仓库方面的原创文章汇总 [解决]CS0016: 未能写入输出文件...\App_Web_default.aspx.cdcab7d2.zii776dc.dll”--"拒绝访问。 " 解决方法 - LiuLei [解决]Windows 7 IIS (HTTP Error 500.21 - Internal Server Error)解决 [解决]无法识别的属性“targetFramework”。请注意属性名称区分大小写。错误解决办法
[转]动态交叉表 二维表
LiuLei · 2013-06-19 · via 博客园 - LiuLei

转:http://hi.baidu.com/zuoboy/item/011a6f50039f09abadc8578f

接着上一文中的例子来说明,上面静态二维表是针对分类列固定的情况,如果科目是变化的,必须新增了一门 国学 ,那又该如何显示呢,通过修改sql当然可以做到,但如果分类列变化频繁,如何处理呢,这时就需要用到动态交叉表。

动态表要素如下图(此图‍转载自CSDN):

以下为生成动态sql的存储过程(oracle10G测试通过)

create or replace procedure create_across_table(tableName        IN VARCHAR2,
                                                newColumn        IN VARCHAR2,
                                                beforeColumnName IN VARCHAR2,
                                                afterColumnName IN VARCHAR2,
                                                groupColumn      IN VARCHAR2,
                                                firstColumnName IN VARCHAR2,
                                                statColumn       IN VARCHAR2,
                                                secondColumnName IN VARCHAR2,
                                                operator         IN VARCHAR2,
                                                resultSql        OUT varchar2
                                                )
AS
/*=================================================================================
    创建人:左红亮 2010年12月2日
    参数:
          tableName                             --生成交叉表依据的表名
          newColumn                             --生成表头依据的字段名
          beforeColumnName                      --定义动态列开始名称
          afterColumnName                       --定义动态列结束名称
          groupColumn                           --分组依据的字段名
          firstColumnName                       --定义第一列名称
          statColumn                            --欲统计的字段名
          secondColumnName                      --定义第二列名称
          operator                              --统计的运算方式
    描述:
          其中 tableName,newColumn,groupColumn,statColumn,operator 为必填项
--//=================================================================================*/
--定义参数
v_rssql       varchar2(1000); -- 交叉表sql
columnName    varchar2(20); --分类列
v_sql         varchar2(90); --查询类别
finalOperator varchar2(10); --最后的分组依据,如果传入为空则默认以max运算
TYPE ref_cursor_type IS REF CURSOR;
ctxx ref_cursor_type;
begin
dbms_output.put_line('aaa');

begin
    if tableName is not null then
      v_rssql := 'SELECT ' || groupColumn;
      if firstColumnName is not null then
        v_rssql := v_rssql || ' ' || firstColumnName; --第一列的别名
      end if;
   
      v_sql := 'SELECT DISTINCT ' || newColumn || ' FROM ' || tableName;
      if operator is null then
        finalOperator := operator;
      else
        finalOperator := 'MAX';
      end if;
      open ctxx for v_sql;
      loop
        --循环游标
        fetch ctxx
          into columnName;
        exit when ctxx%notfound;
        v_rssql := v_rssql || ' ,' || finalOperator || '(CASE ' ||
                   newColumn || ' WHEN ' || '''' || columnName || '''' ||
                   ' THEN ' || statColumn || ' ELSE Null END ) ';
        --给字段起别名
        if beforeColumnName is not null then
          v_rssql := v_rssql || ' ' || beforeColumnName;
        end if;
        v_rssql := v_rssql || columnName;
        if afterColumnName is not null then
          v_rssql := v_rssql || afterColumnName;
        end if;
        dbms_output.put_line('----------' || columnName);
     
      end loop;
      close ctxx;
      --拼接结束sql
      v_rssql := v_rssql || ' FROM ' || tableName || ' GROUP BY ' ||
                 groupColumn;
      dbms_output.put_line('22' || v_rssql);
      resultSql := v_rssql;
    end if;
end;
end create_across_table;

测试环境:

1、建表语句:

create table REPORT
(
ID      NUMBER,
NAME    VARCHAR2(10),
SUBJECT VARCHAR2(10),
GRADE   NUMBER
)
tablespace STOCOM
pctfree 10
initrans 1
maxtrans 255
storage
(
    initial 128K
    next 128K
    minextents 1
    maxextents unlimited
    pctincrease 0
);
-- Add comments to the columns
comment on column REPORT.NAME
is '姓名';
comment on column REPORT.SUBJECT
is '科目';
comment on column REPORT.GRADE
is '成绩';

2、插入测试语句:

insert into REPORT (ID, NAME, SUBJECT, GRADE)
values (1, '张三', '语文', 80);
insert into REPORT (ID, NAME, SUBJECT, GRADE)
values (2, '张三', '数学', 90);
insert into REPORT (ID, NAME, SUBJECT, GRADE)
values (3, '张三', '英语', 70);
insert into REPORT (ID, NAME, SUBJECT, GRADE)
values (4, '李四', '语文', 50);
insert into REPORT (ID, NAME, SUBJECT, GRADE)
values (5, '李四', '数学', 90);
insert into REPORT (ID, NAME, SUBJECT, GRADE)
values (6, '李四', '英语', 60);
insert into REPORT (ID, NAME, SUBJECT, GRADE)
values (7, '王五', '语文', 90);
insert into REPORT (ID, NAME, SUBJECT, GRADE)
values (8, '王五', '数学', 90);
insert into REPORT (ID, NAME, SUBJECT, GRADE)
values (9, '王五', '英语', 90);

3、创建存储过程

4、测试

     见下图:sqlsql中测试

resultsql是返回的sql语句,最后结果如下图: