【问题标题】:About SQL pivot query关于 SQL 透视查询
【发布时间】:2019-02-28 15:04:54
【问题描述】:

这是静态数据透视查询:

SELECT  
    *
FROM
    (SELECT
         PI.PRODID||' '||' ('||PI.PRODNAME||' - '||PI.PACKSIZE||')' PNAME,I.SIA_ID, IP.SALES_QTY
     FROM 
         DIS_INVOICE_INFO I, DIS_INVOICE_PRODUCT IP, MKT_PROD_INFO PI
     WHERE
         I.SLNO = IP.SLNO
         AND PI.PRODID = IP.PRODID) s
PIVOT  
    (SUM(SALES_QTY) 
        FOR SIA_ID IN (10080, 10084, 10082)
    ) pvt

但我想要一个动态查询。

喜欢:

......
PIVOT 
    (SUM(SALES_QTY) 
         FOR SIA_ID IN (SELECT DISTINCT SIA_ID FROM DIS_INVOICE_INFO) 
    ) pvt

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它
  • 您使用的是哪个 DBMS?

标签: sql oracle pivot


【解决方案1】:

你没有提到你的DBMS,我不知道其他DBMS系统但是Oracle你可以让它动态,只要你产生XML结果,如以下情况:

SELECT  
    *
FROM
    (SELECT PI.PRODID||' '||' ('||PI.PRODNAME||' - '||PI.PACKSIZE||')' PNAME,
            I.SIA_ID, IP.SALES_QTY
       FROM DIS_INVOICE_INFO I 
       INNER JOIN DIS_INVOICE_PRODUCT IP 
          ON (I.SLNO = IP.SLNO)
       INNER JOIN MKT_PROD_INFO PI
          ON (PI.PRODID = IP.PRODID)) s
PIVOT XML 
    (SUM(SALES_QTY) 
        FOR SIA_ID IN (SELECT DISTINCT SIA_ID FROM DIS_INVOICE_INFO)
    ) pvt;

通过使用以下DDL 语句;

create table DIS_INVOICE_INFO(SIA_ID int, SLNO int);
create table DIS_INVOICE_PRODUCT(PRODID int, SALES_QTY int, SLNO int);
create table MKT_PROD_INFO(PRODID int,PRODNAME varchar(90),PACKSIZE int);

insert all 
       into DIS_INVOICE_INFO values(10080,1);
       into DIS_INVOICE_PRODUCT values(1,100,1);
       into MKT_PROD_INFO values(1,'Milk',200);
select * from dual;

上述SQL-Select 语句的结果如下:

   PNAME       SIA_ID_XML
  ------------ ---------- 
  (Milk - 200)   <CLOB>

&lt;CLOB&gt; 在哪里

<PivotSet><item><column name = "SIA_ID">10080</column>
<column name = "SUM(SALES_QTY)">100</column></item></PivotSet>

附:你不能动态地使用PIVOT 没有 XML 选项,我的意思是需要像你的情况一样在IN 子句中明确列出所有参数。

【讨论】:

  • Oracle 数据库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2021-06-29
  • 2017-02-22
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多