2016-01-21 267 views
0

我有以下格式的表格数据,甲骨文:如何在列动态显示列数据的Oracle SQL

Roll_No Paper Code Inst_Code 
1  71   10 
1  72   10 
1  73   10 
2  71   10 
2  73   10 
2  75   10 
3  72   11 
3  73   11 
4  71   11 
4  73   11 

等。 我想在动态下面的格式来显示数据...

Inst_Code 71  72  73  75 
--------  --- ---  --- --- 
10   2  1  2  1 
11   1  1  2  0 
+0

所以,如果有人插入纸鳕鱼E 78,你突然想到第78列出现? – jarlh

+0

我怀疑它是'选择paper_code,inst_code,从t组通过paper_code,inst_code'计数(*)并且通过'paper_code'值进行转置?数据透视栏'71','72' ...不能动态定义。 –

回答

3
with t(Roll_No, 
Paper_Code, 
Inst_Code) as 
(   select 1, 71, 10 from dual 
    union all select 1, 72, 10 from dual 
    union all select 1, 73, 10 from dual 
    union all select 2, 71, 10 from dual 
    union all select 2, 73, 10 from dual 
    union all select 2, 75, 10 from dual 
    union all select 3, 72, 11 from dual 
    union all select 3, 73, 11 from dual 
    union all select 4, 71, 11 from dual 
    union all select 4, 73, 11 from dual) 

select * 
    from (select paper_code, inst_code, count(*) total 
      from t 
     group by paper_code, inst_code) pivot(sum(total) for paper_code in(71, 
                      72, 
                      73, 
                      75)); 
+0

请解释你为什么使用union all选择。另外,'与'是什么意思? – user3553260

1

我不相信,你可以建立一个SQL这样做,因为你有一个可变数目或列。我能找到的最好的是一些动态的SQL建立查询:

set serveroutput on 
DECLARE 
    vSQL    VARCHAR2(1000) := 
    'SELECT * 
     FROM (SELECT paper_code, inst_node 
       FROM test) 
     PIVOT (count(1) FOR (paper_code) IN (PaperCodeList)) 
     order by inst_node'; 
    vPaperCodeList VARCHAR2(1000); 
BEGIN 
    SELECT LISTAGG(paper_code || ' as "' || paper_code ||'"', ', ') WITHIN GROUP (ORDER BY paper_code) as list 
     INTO vPaperCodeList 
     FROM (SELECT DISTINCT paper_code FROM test); 

    vSQL  := REPLACE(
         vSQL, 
         'PaperCodeList', 
         vPaperCodeList 
         ); 
    dbms_output.put_line(vSQL); 
END; 
/ 

这将建立一个像查询以下内容:

SQL> SELECT * 
    2  FROM (SELECT paper_code, inst_node 
    3    FROM test) 
    4  PIVOT (count(1) FOR (paper_code) IN (71 as "71", 72 as "72", 73 as "73", 75 as "75")) 
    5  order by inst_node; 

INST_NODE   71   72   73   75 
---------- ---------- ---------- ---------- ---------- 
     10   2   1   2   1 
     11   1   1   2   0 
0

直率的回答不会为列的动态列表工作枢纽你必须宣布他们所有的人,因此他们的号码不能改变。比动态构建SQL另一种选择是使用XML(可使用“在任何”):

SELECT * 
    FROM (
      SELECT Roll_No, 
       Paper_Code, 
       Inst_Code 
      FROM t 
      ) 
      PIVOT XML(COUNT(Roll_No) AS "Value" FOR paper_code IN (ANY)) 

这样的输出将是2列:inst_code和paper_code_xml,你都与他们的价值观的paper_counts:

INST_CODE PAPER_CODE_XML 
10 <XMLTYPE> 
11 <XMLTYPE> 

在XML值是:

<PivotSet> 
<item> 
    <column name = "PAPER_CODE">71</column> 
    <column name = "Value">2</column> 
</item> 
<item> 
    <column name = "PAPER_CODE">72</column> 
    <column name = "Value">1</column> 
</item> 
<item> 
    <column name = "PAPER_CODE">73</column> 
    <column name = "Value">2</column> 
</item> 
<item> 
    <column name = "PAPER_CODE">75</column> 
    <column name = "Value">1</column> 
</item>