【问题标题】:How to pivot table based on assigned "ID" to value in SQL?如何根据分配的“ID”将表数据透视到 SQL 中的值?
【发布时间】: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


【解决方案1】:

您只需要想出一种方法来确保每个聚合只能发生一次。一种方法是通过given_id添加行号分区:

;WITH x AS 
(
  SELECT given_id, data, rn = ROW_NUMBER() OVER 
         (PARTITION BY given_id ORDER BY data)
  FROM dbo.example_table
)
SELECT [1],[2],[3]
  FROM x
  PIVOT (MIN(data) FOR given_id IN ([1],[2],[3])) AS p;

虽然我只用 5 个潜在值来测试它可能还不够。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2022-01-12
    相关资源
    最近更新 更多