【问题标题】:SQL pivot and fill in NULL valuesSQL 透视并填写 NULL 值
【发布时间】:2017-05-19 04:44:08
【问题描述】:

在 SQL (SQLite) 中,我有一个表“权重”,其中包含每个项目大小的权重,例如

item size    weight
---- ----    ------
 a   small     1.2
 a   medium    2.2
 b   medium    1.6
 c   small     1.0
 c   medium    1.5
 c   large     2.0

如何对表格进行透视,以便拥有每个唯一值一行的“项目”列,然后为出现在“大小”中的每个值设置列。如果给定大小的项目没有权重,则会插入 NULL 值,例如

item small medium large
---- ----- ------ -----
 a    1.2   2.2   NULL
 b    NULL  1.6   NULL
 c    1.0   1.5   2.0

【问题讨论】:

    标签: sql database sqlite null pivot


    【解决方案1】:
    Select item
          ,max(case when size='small'  then weight else null end) as small
          ,max(case when size='medium' then weight else null end) as medium
          ,max(case when size='large'  then weight else null end) as large
     From weights
     Group By item
    

    编辑 - 动态版本

    Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([size]) From YourTable Order by 1 For XML Path('')),1,1,'') 
    Select  @SQL = '
    Select [Item],' + @SQL + '
    From YourTable
     Pivot (max(weight) For [size] in (' + @SQL + ') ) p'
    Exec(@SQL);
    

    注意:我已经很多年没有使用 SQLite 了。不确定这种动态方法是否可行

    【讨论】:

    • 看起来不错!如果我不知道“大小”列中的值是什么,我该怎么做? (目前您已将它们硬编码)
    • @user7343733 见编辑 - 动态版本
    【解决方案2】:

    NULL 是不满足条件时 CASE 的结果。

    Select      item
               ,max(case when size='small'  then weight end) as small
               ,max(case when size='medium' then weight end) as medium
               ,max(case when size='large'  then weight end) as large
    From        weights
    Group By    item
    

    Select      item
               ,max(case size when 'small'  then weight end) as small
               ,max(case size when 'medium' then weight end) as medium
               ,max(case size when 'large'  then weight end) as large
    From        weights
    Group By    item
    

    【讨论】:

      猜你喜欢
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多