带有计数的数据透视表-Oracle SQL

时间:2019-05-08 17:21:07

标签: sql oracle

我有这张桌子:

表1

id      e_nm            val         count
2572    Fruit Date      20180115    13
2572    Fruit Date      20180504    21
2573    Salad Date      ABC         50
2574    Test Date       20181115    14
2574    Test Date       19991001    29

此表具有每个e_nm(元素名称)及其计数的所有不同值。该表具有数千个可用值,其中包含500多个元素名称。

有没有一种方法可以像使用Pivot一样可视化它:

id_2572     id_2572_e_nm    id_2573     id_2573_e_nm     id_2574        id_2574_e_nm
20180115    Fruit Date      ABC         Salad Date       20181115       Test Date
20180504    Fruit Date                                   19991001       Test Date

请注意,需要通过从table1中读取id来动态生成table列。

1 个答案:

答案 0 :(得分:1)

尽管不完全像您想象的那样,但我想出了一个解决方案。基本上,您将需要在源表中创建一个名为“唯一ID”的新列。这是您将要旋转表的唯一标识符。

之后,您将需要使用以下查询来获取几乎所需的输出:

SELECT * FROM
(
  SELECT 
    unique_id, 
    e_nm, 
    val
  FROM table1
)
PIVOT 
(
  listagg(val) within group (order by null) as id, listagg(e_nm) within group (order by null) as id_e_nm
  FOR e_nm IN ('Fruit Date','Salad Date','Test Date')
)

这将为您提供以下输出:

body {
    margin: 0;
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
    font-size: 14px;
    line-height: 20px;
    color: #333;
    background-color: #fff;
}
<table class="results table table-bordered table-striped">
  <tbody>
    <tr>
      <th>UNIQUE_ID</th>
      <th>'Fruit Date'_ID</th>
      <th>'Fruit Date'_ID_E_NM</th>
      <th>'Salad Date'_ID</th>
      <th>'Salad Date'_ID_E_NM</th>
      <th>'Test Date'_ID</th>
      <th>'Test Date'_ID_E_NM</th>
    </tr>
    <tr>
      <td>1</td>
      <td>20180115</td>
      <td>Fruit Date</td>
      <td>ABC</td>
      <td>Salad Date</td>
      <td>20181115</td>
      <td>Test Date</td>
    </tr>
    <tr>
      <td>2</td>
      <td>20180504</td>
      <td>Fruit Date</td>
      <td>(null)</td>
      <td>(null)</td>
      <td>19991001</td>
      <td>Test Date</td>
    </tr>
  </tbody>
</table>

Here是我为回答您的问题而创建的SQL Fiddle查询的链接。

希望这会为您指明正确的方向:)