【发布时间】:2021-11-06 12:07:39
【问题描述】:
我有一个表格,其中包含加载后看起来类似的数据:
| given_id | data |
|---|---|
| 1 | example_val1_col_1 |
| 2 | example_val1_col_2 |
| 3 | example_val1_col_3 |
| 1 | example_val2_col_1 |
| 2 | example_val2_col_2 |
我分配给此数据的 ID 引用了他们接下来应该去哪一列。 我想要实现的是将数据转换为如下所示:
| 1 | 2 | 3 |
|---|---|---|
| example_val1_col_1 | example_val1_col_2 | example_val1_col_3 |
| example_val2_col_1 | example_val2_col_2 | NULL |
我尝试过的是简单的旋转,但没有帮助,因为它的聚合函数与行不正确匹配。
select [1],[2],[3]
from
(
select given_id, data
from example_table
) d
pivot
(
min(data)
for given_idin ([1],[2],[3])
) piv;
我将如何正确地做到这一点? 谢谢
【问题讨论】:
-
您的问题非常有问题,需要更多信息。没有列可以用来知道哪些数据应该在哪一行返回(除非你给我们规则)。例如,为什么“example_val1_col_2”会出现在与“example_val1_col_1”相同的行中?
-
例如 Aaron 添加了不在问题
ORDER BY data中的信息,但谁说这是适合您的顺序?如果您的规则使用值的开头,例如“example_val1”将在结果的第一行,“example_val2”在第二行,依此类推,那么 Aaron 的解决方案对于数据(1,'example_val2_col_1'),(1,'example_val1_col_1'),(2,'example_val1_col_2'),(3,'example_val2_col_3'),(2,'example_val2_col_2');将失败在这种情况下 example_val2_col_3 将是在第一行。 -
Aaron 的解决方案仅在提供的特定示例数据中“靠运气”起作用,除非提供更多信息。另外请注意,他的解决方案将 null 推送到结束,即使它应该在上面的行之一中。需要更多信息来了解结果集中同一行中的值的规则是什么
-
我的目标是这些行将按照它们被加载的顺序排列,因此按照它们在原始文件中的顺序排列。我首先给出 ID 的规则是基于给定行中的数据。例如,如果此行值的开头是“X@”,那么它的 ID 号应该是 3。
标签: sql sql-server tsql pivot pivot-table