【问题标题】:PIVOT Table from soft configured fields with ID Grouping来自具有 ID 分组的软配置字段的数据透视表
【发布时间】:2020-04-27 05:57:21
【问题描述】:

我有一些动态表单字段作为配置存储在数据库中,并将值保存在单独的表中,我想创建一个视图,该视图提供 PIVOT 表,将 FieldName 值转换为列,然后按身份证。

如下表:

ID  |  FieldName      |  FieldValue
1      An Integer        10
1      A String          Hello
1      A boolean         True
2      An Integer        20
2      A String          Goodbye
2      A Date            01/01/2010 

将输出为:

ID    |  [An Integer]    |  [A String]   |  [A boolean]   |  [A Date]
1        10                 Hello           True             Null
2        20                 Goodbye         NULL             01/01/2010

可能有比这个更多的列名,我可以接受它的动态方面,但假设上面的表格是固定的,我如何实现 PIVOT?

【问题讨论】:

  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称(并且枢轴功能是高度特定于 DBMS 的)。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS

标签: sql sql-server sql-server-2008 pivot pivot-table


【解决方案1】:

假设您正在处理一个固定的字段名称列表,您可以只使用条件聚合。这是一个跨 RDBMS 解决方案,不依赖于特定于供应商的 PIVOT 实现,并且通常表现良好或更好:

select 
    ID,
    max(case when FieldName = 'An Integer' then FieldValue end) an_integer,
    max(case when FieldName = 'A String' then FieldValue end) a_string,
    max(case when FieldName = 'A Boolean' then FieldValue end) a_boolean,
    max(case when FieldName = 'A Date' then FieldValue end) a_date
from mytable
group by ID

【讨论】:

    【解决方案2】:
    SELECT * 
    FROM your_table
    PIVOT (
      MAX(FieldValue)
      FOR FieldName in (
        'An Integer', 'A String', 'A boolean', 'A Date'
      )
    )
    

    在您的示例中,您没有指定应如何聚合结果。所以我只使用了最大值。分组是通过枢轴完成的,因此不需要额外的分组依据或类似的东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多