【问题标题】:PIVOT multiple rows into columnsPIVOT 多行成列
【发布时间】:2015-03-17 07:59:48
【问题描述】:

我有如下表。考虑查询

select invoice_mth, inv_amt from table xdetails
 where mobile_number=9080808080

表格中的数据

mobile_number   invoice_mth  inv_amt
 9080808080     2010-10        20
 9080808080     2010-11        30
 9080808080     2010-12        40

我必须显示下表中的数据。

我希望发票月份分开每个月和 amt。

MOBILE_NUMBER   inv_m1   inv_m2    inv_m3   amt1    amt2    amt3
------- ----------------------------------------------------------
 9080808080    2010-10   2010-11   2010-12   20       30      40

要像上面那样显示数据我必须做什么?

【问题讨论】:

  • Stackoverflow 上有很多重要的问题和答案。如果您的情况紧急,您应该阅读this search result set 中的一些主题。主要问题是,您知道要预先旋转的行数吗?还是您需要动态解决方案?

标签: sql oracle oracle11g pivot


【解决方案1】:

您可以使用标准的 PIVOT 查询:

SQL> SELECT * FROM t;

MOBILE_NUMBER INVOICE    INV_AMT
------------- ------- ----------
   9080808080 2010-10         20
   9080808080 2010-11         30
   9080808080 2010-12         40

SQL>
SQL> SELECT *
  2  FROM
  3    (SELECT mobile_number, invoice_mth, inv_amt FROM t
  4    ) PIVOT (MIN(invoice_mth) AS inv_mth,
  5             SUM(inv_amt) AS inv_amt
  6             FOR (invoice_mth) IN ('2010-10' AS m1, '2010-11' AS m2, '2010-12' AS m3))
  7  ORDER BY mobile_number;

MOBILE_NUMBER M1_INV_ M1_INV_AMT M2_INV_ M2_INV_AMT M3_INV_ M3_INV_AMT
------------- ------- ---------- ------- ---------- ------- ----------
   9080808080 2010-10         20 2010-11         30 2010-12         40

SQL>

【讨论】:

  • 105 57060 36069 WCT 5.25% 5.25 105 57060 36069 Sec 194C - 承包商 - 非个人 2% PWCPL 2 105 57060 36070 Sec 194C - 承包商 - 非个人 2% PWCPL 360705 WCT 57026 105 57060 36071 WCT 5.25%5.25 105 57060 36072 SEC 194C - 承包商 - 非单个2%PWCPL 2 105 57060 36072 WCT 5.25%5.25 105 57060 36073 WCT 5.25%5.25 105 57060 36074 WCT 5.25%5.25 105 57060 36074 SEC 194C - 承包商 - 非个人 2% PWCPL 2
  • 请将其标记为已回答,它也会对其他人有所帮助。
  • 枢轴功能震撼! :)
  • 嗨,Lalith,在这里,你在类中传递静态值,但是如果我们想将此值设为非静态(动态)值,我们该怎么做。我尝试过 PIVOT XML,但它显示的是 XML 标记,而不是显示在表格中。你能为此提供解决方案吗..请我上周面临这个问题的问题..我非常感谢你的回复...
  • 我理解您的担忧。但是,对于动态旋转,我知道的唯一方法是使用 PL/SQL,Tom Kyte 在这里展示了一个示例oracle.com/technetwork/issue-archive/2012/12-jul/…
【解决方案2】:

如果您希望输出中的列数固定:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE TABLE_NAME ( mobile_number, invoice_mth, inv_amt ) AS
          SELECT 9080808080, '2010-10', 20 FROM DUAL
UNION ALL SELECT 9080808080, '2010-11', 30 FROM DUAL
UNION ALL SELECT 9080808080, '2010-12', 40 FROM DUAL;

查询 1

SELECT mobile_number,
       MAX( CASE RN WHEN 1 THEN invoice_mth END ) AS inv_m1,
       MAX( CASE RN WHEN 2 THEN invoice_mth END ) AS inv_m2,
       MAX( CASE RN WHEN 3 THEN invoice_mth END ) AS inv_m3,
       MAX( CASE RN WHEN 1 THEN inv_amt END ) AS amt1,
       MAX( CASE RN WHEN 2 THEN inv_amt END ) AS amt2,
       MAX( CASE RN WHEN 3 THEN inv_amt END ) AS amt3
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY mobile_number ORDER BY invoice_mth ASC ) AS rn
  FROM   TABLE_NAME t
)
GROUP BY mobile_number

Results

| MOBILE_NUMBER |  INV_M1 |  INV_M2 |  INV_M3 | AMT1 | AMT2 | AMT3 |
|---------------|---------|---------|---------|------|------|------|
|    9080808080 | 2010-10 | 2010-11 | 2010-12 |   20 |   30 |   40 |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多