【问题标题】:SQL Server : display multiple rows in one row and multiple columnsSQL Server:在一行和多列中显示多行
【发布时间】:2015-10-05 19:56:53
【问题描述】:

我发现了类似的问题,但没有任何解决方案能够为我解决问题。我一直没有练习并坚持这一点。

我有一个跟踪员工职位的表格。每个员工可以拥有任意数量的活动职位。我想将每个员工显示为一条记录,该记录中的所有职位跨越多个列。

查看数据显示没有超过 6 个在职职位的员工,由于这是一次性查询,我应该可以使用该数字。

所有职位都分配了一个序列号,但它们的顺序不是很方便 - 员工的非活动职位保留序列号。

所以现在我有一些看起来像这样的东西:

    ID | Name | Title | Cat | Seq
    ------------------------------
    10 | John | Asst. | HR  | 13
    10 | John | Tutor | EDU | 17
    11 | Sue  | Mgr   | PA  | 6
    11 | Sue  | Adj.  | EDU | 7
    11 | Sue  | Tutor | EDU | 13
    ...
    11 | Sue  | Asst. | HR  | 22

但我希望它看起来像这样:

    ID | Name | Title 1 | Cat 1 | Title 2 | Cat 2 | Title 3...| Title 6 | Cat 6
    ----------------------------------------------------------------------------
    10 | John | Asst.   | HR    | Tutor   | EDU   | NULL      | NULL    | NULL
    11 | Sue  | Mgr.    | PA    | Adj.    | EDU   | Tutor     | Asst.   | HR

让我知道我需要提供哪些额外信息。

【问题讨论】:

  • 您可能最终会进入PIVOTs 领域,在您尝试做的事情的背景下,它们可能有点难以使用,特别是如果您尝试生成动态列数。这种做法违背了 RDBMS 的原则,因为您正在对数据进行非规范化。
  • 呃,我担心枢轴会是建议。 re: 非规范化,只是一次数据转储,所以在这种情况下它不是问题。
  • 如果是一次性的,我建议添加一列ROW_NUMBER() over (PARTITION BY ID ORDER BY Cat, Title),然后您可以将其用作 Excel 或其他电子表格程序中的索引来转置它们。

标签: sql-server multiple-columns


【解决方案1】:

您可以结合使用 row_number 和 pivots 来执行此操作。使用 SQL Server 2012+,查询可能如下所示。这有点乱,但它应该可以完成工作,尽管可能有更好的方法来实现相同的结果。

select 
    id
    , name
    , max([Title 1]) as [Title 1]
    , max([Cat 1])   as [Cat 1]
    , max([Title 2]) as [Title 2]
    , max([Cat 2])   as [Cat 2]
    , max([Title 3]) as [Title 3]
    , max([Cat 3])   as [Cat 3]
    -- and so on for the remaining columns...
from (
    select 
       id, name, title, cat
       , t = concat('Title ',row_number() over (partition by id order by seq)) 
       , c = concat('Cat ',row_number() over (partition by id order by seq)) 
    from your_table
    ) src
pivot ( max(title) for t in ([title 1],[title 2],[title 3]) )pt
pivot ( max(cat)   for c in ([cat 1],[cat 2],[cat 3]) )pc
group by id, name;

我只写了标题/类别 1 到 3 以节省一些空间,但你应该明白了。

Sample SQL Fiddle

示例结果:

| id | name | Title 1 | Cat 1 | Title 2 | Cat 2 | Title 3 |  Cat 3 |
|----|------|---------|-------|---------|-------|---------|--------|
| 10 | John |   Asst. |   HR  |   Tutor |   EDU |  (null) | (null) |
| 11 |  Sue |   Mgr   |   PA  |   Adj.  |   EDU |   Tutor |    EDU |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多