我有一个采用以下形式的表格:
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/