【问题标题】:Pivot table into multiple columns and multiple rows将数据透视表分成多列和多行
【发布时间】:2017-11-09 00:30:18
【问题描述】:

背景 我有一个表,其中包含一个带有逗号分隔字符串的 varchar(它有多行类似于this 问题。不幸的是,我无法找到将 csv varchar 简单地更改为临时表的方法,所以我是正在考虑自己拆分它。(我也很感激任何解决这个问题的答案,尽管它可能应该是一个单独的问题?)。

问题

我已成功拆分字符串,现在正在生成类似于以下内容的输出:

   -------------------------------------
   | Row Index  | Column Index | Value |
   -------------------------------------
   |     0      |      0       | (0,0) |
   |     0      |      1       | (1,0) |
   |     0      |      2       | (2,0) |
   |     1      |      0       | (0,1) |
   |     1      |      1       | (1,1) |
   |     1      |      2       | (2,1) |
   |     2      |      0       | (0,2) |
   |     2      |      1       | (1,2) |
   |     2      |      2       | (2,2) |
   -------------------------------------

我想对此进行旋转,以便将其插入临时表中,最终结果如下所示:

   -------------------------------------
   | Column 1  | Column 2  | Column 3  |
   -------------------------------------
   |   (0,0)   |   (1,0)   |   (2,0)   |
   |   (0,1)   |   (1,1)   |   (2,1)   |
   |   (0,2)   |   (1,2)   |   (2,2)   |
   -------------------------------------

旁白

  1. 列数是提前知道的,但也欢迎不依赖于此的答案。
  2. 我知道我可以反复左外连接第一个表来获得这个结果,但这需要每列外连接一次(因为我有大约 9 列,这将是很多重复),我假设还有另一个方式。
  3. 性能不是关键,但最终表格中将有大约 2000 行 8 列。

【问题讨论】:

  • 您可能想阅读这篇解释规范 SQL 数据透视技术的文章:modern-sql.com/use-case/pivot
  • 干杯马库斯,我以前必须解决这个问题,但希望我当时遇到过这个问题(我以前不得不使用 JOIN 多次方法)。

标签: sql sql-server


【解决方案1】:

使用条件聚合:

select 
    RowIndex
  , Column1 = max(case when ColumnIndex=0 then Value end)
  , Column2 = max(case when ColumnIndex=1 then Value end)
  , Column3 = max(case when ColumnIndex=2 then Value end)
from t
group by RowIndex

rextester 演示:http://rextester.com/QLPHR39222

返回:

+----------+---------+---------+---------+
| RowIndex | Column1 | Column2 | Column3 |
+----------+---------+---------+---------+
|        0 | (0,0)   | (1,0)   | (2,0)   |
|        1 | (0,1)   | (1,1)   | (2,1)   |
|        2 | (0,2)   | (1,2)   | (2,2)   |
+----------+---------+---------+---------+

pivot():

select 
    RowIndex
  , Column1 = [0]
  , Column2 = [1]
  , Column3 = [2]
from t
pivot (max(Value) for ColumnIndex in ([0],[1],[2])) p

【讨论】:

  • 感谢 SqlZim,我到处都看到了类似的答案,但没想到要添加 group by 以获得多行。我要离开一会儿,这样我就可以玩一玩,看看是否有人有其他答案
【解决方案2】:

这是 PIVOT 查询 (See The Docs) 的简单应用:

select x.[0] Column1
     , x.[1] Column2
     , x.[2] Column3
  from YourData
 pivot (max(Value)
   for [Column Index]
    in ([0], [1], [2]) ) x
 order by x.[Row Index]

返回:

| Column1 | Column2 | Column3 |
|---------|---------|---------|
|   (0,0) |   (1,0) |   (2,0) |
|   (0,1) |   (1,1) |   (2,1) |
|   (0,2) |   (1,2) |   (2,2) |

SQL Fiddle

要添加更多列,只需将更多列索引添加到 FOR column IN (list) 部分,然后将相同的值添加到投影(选择列表)

【讨论】:

  • 谢谢,我无法完全理解文档。我会看看你的例子,并尝试确保它坚持下去。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多