【问题标题】:SQL Table Rows to Columns - Possible PIVOT?SQL 表行到列 - 可能的 PIVOT?
【发布时间】:2014-08-04 16:02:26
【问题描述】:

我有一个来自 Active Direcory 的信息表,但不幸的是它是这样显示的;

+------+------------+----------------+-------------------+
| dnId | propNameId |  propertyName  |   propertyValue   |
+------+------------+----------------+-------------------+
|    1 |         10 | objectsid      | S-1-5-32-548      |
|    1 |         19 | _objectclass   | group             |
|    1 |         80 | cn             | Account Operators |
|    1 |         82 | samaccountname | Account Operators |
|    1 |         85 | name           | Account Operators |
|    2 |         10 | objectsid      | S-1-5-32-544      |
|    2 |         19 | _objectclass   | group             |
|    2 |         80 | cn             | Administrators    |
|    2 |         82 | samaccountname | Administrators    |
|    2 |         85 | name           | Administrators    |
|    3 |         10 | objectsid      | S-1-5-32-551      |
|    3 |         19 | _objectclass   | group             |
|    3 |         80 | cn             | Backup Operators  |
|    3 |         82 | samaccountname | Backup Operators  |
|    3 |         85 | name           | Backup Operators  |
+------+------------+----------------+-------------------+

使用一堆临时表和连接,我可以让它显示我想要的方式,就像这样;

+------+--------------+--------------+-------------------+-------------------+-------------------+
| dnId |  objectsid   | _objectclass |        cn         |  samaccountname   |       name        |
+------+--------------+--------------+-------------------+-------------------+-------------------+
|    1 | S-1-5-32-548 | group        | Account Operators | Account Operators | Account Operators |
|    2 | S-1-5-32-544 | group        | Administrators    | Administrators    | Administrators    |
|    3 | S-1-5-32-551 | group        | Backup Operators  | Backup Operators  | Backup Operators  |
+------+--------------+--------------+-------------------+-------------------+-------------------+

但这感觉真的很混乱和冗长.. 我确信一定有更优雅的方式来做到这一点,也许使用 PIVOT,我已经尝试过(但失败了)明白。

有什么想法/建议吗?

编辑:抱歉,删除了 mysql 标签(这是自动建议的)。我正在使用 MS SQL Server 2008 R2。

【问题讨论】:

  • 这里有一个answer 类似的问题。

标签: sql sql-server pivot


【解决方案1】:

您没有指定您使用的数据库,但以下将在 SQL Server 或 MySQL 中工作。您可以使用带有 CASE 表达式的聚合函数来创建新的列名:

select
  dnid,
  max(case when propertyName = 'objectsid' then propertyValue end) objectsid,
  max(case when propertyName = '_objectclass ' then propertyValue end) objectclass ,
  max(case when propertyName = 'cn' then propertyValue end) cn,
  max(case when propertyName = 'samaccountname' then propertyValue end) samaccountname,
max(case when propertyName = 'name' then propertyValue end) name
from yourtable
group by dnid;

SQL Fiddle with Demo

【讨论】:

    【解决方案2】:

    如果您使用的是 SQL Server(从您的标签中不确定),此查询将生成您正在寻找的结果,使用 PIVOT

    SELECT p.*
    FROM (
      SELECT dnId, propertyName, propertyValue FROM myTable
    ) AS t
    PIVOT(
      MAX(propertyValue)
      FOR propertyName IN (objectsid, _objectclass, cn, samaccountname, name)
    ) AS p;
    

    查看SQL Fiddle here

    【讨论】:

    • 这成功了,谢谢!为mysql标签道歉,它是自动建议的,我盲目地点击它。以后会更加小心。
    • @Valiante:没问题,欢迎来到 Stack Overflow :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2021-11-23
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多