【问题标题】:How to split a column into 3 columns?如何将一列拆分为 3 列?
【发布时间】:2016-11-14 11:14:57
【问题描述】:

我已经有 3 列这样的表 1:

-------------------
|  A  |  B  |  C  |
-------------------

和表 2:

----------------
|  id  |  col  |
----------------
|   1  |   2   |
|   2  |   6   |
|   3  |   1   |
|   4  |   8   |
|   5  |   9   |
|   6  |   5   |
|   7  |   4   |
|   8  |   3   |
|   9  |   7   |
----------------

我想从表 2 的 col 列插入表 1 并得到如下结果:

-------------------
|  A  |  B  |  C  |
-------------------
|  2  |  8  |  4  |
|  6  |  9  |  3  |
|  1  |  5  |  7  |
-------------------

有什么建议吗?非常感谢。

【问题讨论】:

  • 但是你正好有 9 条记录?或者有什么模式吗?
  • 你怎么知道1,2,3进入A列,4,5,6进入B列,7,8,9进入C列?
  • 请发布有关您的要求的更多详细信息,您可能会在示例中得到不符合您实际要求的方案的答案
  • 数据库表喜欢按行增长,但您的数据意味着按列增长,这可能导致无限问题。你能澄清一下你想要达到的目标吗?
  • @JanWalczak 是的,我有 9 条记录。

标签: sql sql-server tsql sql-server-2005


【解决方案1】:

您可以尝试使用DENSE_RANK()确定每组3个,然后CASE EXPRESSION确定a/b/c

INSERT INTO Table1
SELECT MAX(CASE WHEN s.col % 3 = 1 THEN s.col END) as a,
       MAX(CASE WHEN s.col % 3 = 2 THEN s.col END) as b,
       MAX(CASE WHEN s.col % 3 = 0 THEN s.col END) as c
FROM (SELECT t.col ,
             DENSE_RANK() OVER(ORDER BY (s.col -1)/3) as group_rnk
      FROM Table2 s) s
GROUP BY s.group_rnk

我现在看到你标记了 SQL-Server 2005,它还没有DENSE_RANK(),所以你可以用ROW_NUMBER() 试试:

INSERT INTO Table1
SELECT MAX(CASE WHEN s.rnk % 3 = 1 THEN s.col END) as a,
       MAX(CASE WHEN s.rnk % 3 = 2 THEN s.col END) as b,
       MAX(CASE WHEN s.rnk % 3 = 0 THEN s.col END) as c
FROM (SELECT t.col ,
             ROW_NUMBER() OVER(ORDER BY t.id) as group_rnk
      FROM Table2 s) s
GROUP BY (s.group_rnk-1)/3

【讨论】:

  • 我更新了我的问题。请参考我的新问题。
  • 我应该如何知道数字的顺序?你有另一列有 ID 什么的吗?
  • 是的,假设我有 ID 列:declar @Table2 table(id int identity(1,1), col int)
  • @Hanaka 所以只需将所有三个s.col % 3 替换为s.Id_Col % 3ORDER BY s.colORDER BY s.Id_Col
  • 我想进入A列:2、6、1。按照你的方法,我进入A列:2、8、4
猜你喜欢
  • 1970-01-01
  • 2016-11-20
  • 2011-09-21
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多