【问题标题】:How to pivot string rows to multiple columns?如何将字符串行旋转到多列?
【发布时间】:2018-09-04 20:50:23
【问题描述】:

我已经搜索并尝试过,但没有找到我正在寻找的确切 SQL 代码示例。我每个帐户(按行)有多个代表,需要将它们分散到列中。每个帐户最多有 3 个。

我的源数据如下所示:

+---------+-------+------+
| Account | Badge | Name |
+---------+-------+------+
|     123 |   456 | Bob  |
|     123 |   789 | John |
|     123 |   654 | Carl |
+---------+-------+------+

我需要它看起来像这样:

+---------+--------+-------+--------+-------+--------+-------+
| Account | Badge1 | Name1 | Badge2 | Name2 | Badge3 | Name3 |
+---------+--------+-------+--------+-------+--------+-------+
|     123 |    456 | Bob   |    789 | John  |    654 | Carl  |
+---------+--------+-------+--------+-------+--------+-------+

非常感谢任何帮助。

【问题讨论】:

  • 您使用的是哪个 dbms?
  • SQL Server 2017

标签: sql sql-server tsql pivot sql-server-2017


【解决方案1】:

你可以试试这个。

如果您的 DBMS 支持ROW_NUMBER 和窗口函数,则在子查询中制作行号,然后执行条件聚合函数 make pivot

CREATE TABLE T(
   Account INT,
   Badge INT,
   Name VARCHAR(50)

);


INSERT INTO T VALUES (123,456,'Bob');
INSERT INTO T VALUES (123,789,'John');
INSERT INTO T VALUES (123,654,'Carl');

查询 1

SELECT Account,
      MAX(CASE WHEN rn = 1 THEN Badge end) Badge1,
      MAX(CASE WHEN rn = 1 THEN Name end) Name1,
      MAX(CASE WHEN rn = 2 THEN Badge end) Badge2,
      MAX(CASE WHEN rn = 2 THEN Name end) Name2,
      MAX(CASE WHEN rn = 3 THEN Badge end) Badge3,
      MAX(CASE WHEN rn = 3 THEN Name end) Name3
FROM 
(
    SELECT  *,ROW_NUMBER() OVER(ORDER BY Account) rn
    FROM T
) t1
GROUP BY Account 

Results

| Account | Badge1 | Name1 | Badge2 | Name2 | Badge3 | Name3 |
|---------|--------|-------|--------|-------|--------|-------|
|     123 |    456 |   Bob |    789 |  John |    654 |  Carl |

【讨论】:

  • 我得到 Account Badge1 Name1 Badge2 Name2 Badge3 Name3 123 456 Bob 789 John 654 Carl 968 NULL NULL NULL NULL NULL NULL 对于其余的帐号,查询返回 NULL 值。
  • @Gordy 它在 sqlfiddle sqlfiddle.com/#!18/c5568/1 中工作,或者您需要从您的表中提供更多的样本数据
  • sqlfiddle.com/#!18/c5568/2可以加WHERE Account IS NOT NULL
猜你喜欢
  • 2021-03-08
  • 2011-03-08
  • 1970-01-01
  • 2022-12-30
  • 2021-10-08
  • 2022-01-17
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多