sql - 取消展平 table

标签 sql

我有一个采用以下形式的表格:

person, date, food1, food2, food3

我想使用这张表并得到如下所示的结果:

person, date, foodId

例如,如果我的原始表中有一行看起来像这样:

Andy, 1/1/2012,false,true,true

我会得到如下所示的结果

Andy, 1/1/2012, food2
Andy, 1/1/2012, food3

到目前为止我已经

SELECT person, date, 
(
    case 
        when food1 = true then 'food1'
        when food2 = true then 'food2'
        when food3 = true then 'food3'
    end
) as foodId

但是,当每个源行最多有 3 个结果时,这只会获取每个源行一个结果。有什么办法可以修复我的查询,从我的示例中获取 2 行而不是仅仅 1 行吗?

最佳答案

您可以取消数据透视:Using PIVOT and UNPIVOT

设置:

create table diet(person varchar(10), entry datetime, food1 varchar(10), food2 varchar(10), food3 varchar(10))
insert into diet values('John', CURRENT_TIMESTAMP, 'Apple','Pizza','Cake');

逆透视查询:

SELECT person, entry, meal, food
FROM 
   (SELECT person, entry, food1, food2, food3
   FROM diet) p
UNPIVOT
   (food FOR meal IN 
      (food1, food2, food3)
      )AS unpvt;

输出:

person  entry   meal    food
John    2012-02-08 14:42:22.940 food1   Apple
John    2012-02-08 14:42:22.940 food2   Pizza
John    2012-02-08 14:42:22.940 food3   Cake

关于sql - 取消展平 table ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9200910/

相关文章:

sql - Hive 相对于同一表中的其他数组列对数组列进行排序

mysql - 如何设置查询不接受不存在的字段

SQL Server 2008 R2 : Update table using pattern

sql - 如何设置具有不同数量的特定类型外键的表

sql - 创建动态选择案例 (vb)

java - 使用日期类型更新 JTable 单元格

SQL:如何在忽略时间的情况下比较日期?

MySQL过滤查询?

sql - 在 Rails 中,给定一个 Point 对象数组,我如何对每个玩家的点值求和?

sql - 将行复制并粘贴到具有不同值的同一 SQL 表中