【问题标题】:SQL unpivot row to N rows (based on column value)SQL 将行取消透视到 N 行(基于列值)
【发布时间】:2023-03-29 18:47:02
【问题描述】:

我有一个类似于下面示例的表,并尝试 UNPIVOT 表以使每行仅包含一个链接,并根据 UNPIVOT 添加一个信息列。

我设法部分达到了我想要的结果,但在最后一部分需要一些帮助。到目前为止我有这个查询:

SELECT Theme,  Area, URL
FROM
(
  SELECT Theme, Area, URL_1, URL_2, URL_3 
  FROM table

) AS a
UNPIVOT 
(
  URL FOR URLs IN (URL_1, URL_2, Url_3)
) AS b WHERE URL <> '';

如何添加这个额外的列,以及基于 URL 的信息?

提前谢谢你。

<h1>Have</h1>
<table border="1" cellpadding="1" cellspacing="2">
  <tr>
    <th>Theme</th>
    <th>Area</th>

    <th>URL_1</th>
    <th>URL_2</th>
    <th>URL_3</th>
  </tr>
  <tr>
    <td>A</td>
    <td>B</td>

    <td>Some URL</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>A</td>
    <td>C</td>

    <td>Some URL</td>
    <td>Some URL</td>
    <td></td>
  </tr>

  <tr>
    <td>D</td>
    <td>B</td>

    <td>Some URL</td>
    <td>Some URL</td>
    <td></td>
  </tr>

  <tr>
    <td>B</td>
    <td>D</td>

    <td>Some URL</td>
    <td>Some URL</td>
    <td>Some URL</td>
  </tr>
</table>

<h1>Would like</h1>
<table border="1" cellpadding="1" cellspacing="2">
  <tr>
    <th>Theme</th>
    <th>Area</th>

    <th>URL</th>
    <th>Type</th>
  </tr>
  <tr>
    <td>A</td>
    <td>B</td>

    <td>Some URL</td>
    <td>1</td>

  </tr>
  <tr>
    <td>A</td>
    <td>C</td>

    <td>Some URL</td>
    <td>1</td>

  </tr>
  <tr>
    <td>A</td>
    <td>C</td>


    <td>Some URL</td>
    <td>2</td>
  </tr>

  <tr>
    <td>D</td>
    <td>B</td>

    <td>Some URL</td>
    <td>1</td>

  </tr>
  <tr>
    <td>D</td>
    <td>B</td>


    <td>Some URL</td>
    <td>2</td>
  </tr>




  <tr>
    <td>B</td>
    <td>D</td>

    <td>Some URL</td>
    <td>1</td>

  </tr>
  <tr>
    <td>B</td>
    <td>D</td>


    <td>Some URL</td>
    <td>2</td>
  </tr>
  <tr>
    <td>B</td>
    <td>D</td>


    <td>Some URL</td>
    <td>3</td>
  </tr>


</table>

<h1>What I got so far</h1>
<table border="1" cellpadding="1" cellspacing="2">
  <tr>
    <th>Theme</th>
    <th>Area</th>

    <th>URL</th>
  </tr>
  <tr>
    <td>A</td>
    <td>B</td>

    <td>Some URL</td>

  </tr>


  <tr>
    <td>A</td>
    <td>C</td>

    <td>Some URL</td>

  </tr>
  <tr>
    <td>A</td>
    <td>C</td>


    <td>Some URL</td>

  </tr>


  <tr>
    <td>D</td>
    <td>B</td>

    <td>Some URL</td>


  </tr>
  <tr>
    <td>D</td>
    <td>B</td>


    <td>Some URL</td>

  </tr>




  <tr>
    <td>B</td>
    <td>D</td>

    <td>Some URL</td>


  </tr>
  <tr>
    <td>B</td>
    <td>D</td>


    <td>Some URL</td>

  </tr>
  <tr>
    <td>B</td>
    <td>D</td>


    <td>Some URL</td>

  </tr>


</table>

【问题讨论】:

标签: sql sql-server


【解决方案1】:

简短回答:

SELECT Theme,  Area, UrlKind, URL
FROM
(
  SELECT Theme, Area, URL_1, URL_2, URL_3 
  FROM table

) AS a
UNPIVOT 
(
  URL FOR UrlKind IN (URL_1, URL_2, Url_3)
) AS b WHERE URL <> '';

所以该列的名称由 unpivot 的 FOR ... 部分定义。

【讨论】:

  • 感谢您的快速回答。
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 2021-12-27
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多