如何将字符串行转换为多列?

时间:2018-09-04 20:50:24

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

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

我的源数据如下:

{
  "presets": [
    [
      "env",
      {
        "modules": false,
        "targets": {
          "browsers": "> 1%",
          "uglify": true
        },
        "useBuiltIns": true
      }
    ],
    "react",
    "es2015"
  ],
  "plugins": [
    "syntax-dynamic-import",
    "transform-object-rest-spread",
    [
      "transform-class-properties",
      {
        "spec": true
      }
    ]
  ]
}

我需要它看起来像这样:

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

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您可以尝试一下。

如果您的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 |