Sql 把桌子弄平
我有一张表格,其形式如下:Sql 把桌子弄平,sql,Sql,我有一张表格,其形式如下: person, date, food1, food2, food3 我想拿下这张表,得到如下结果: person, date, foodId Andy, 1/1/2012,false,true,true 例如,如果我的原始表中有一行如下所示: person, date, foodId Andy, 1/1/2012,false,true,true 我会得到这样的结果 Andy, 1/1/2012, food2 Andy, 1/1/2012, food3 到目
person, date, food1, food2, food3
我想拿下这张表,得到如下结果:
person, date, foodId
Andy, 1/1/2012,false,true,true
例如,如果我的原始表中有一行如下所示:
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个结果时,每个源行只能获取一个结果。有没有办法修复我的查询,从我的示例中获得两行而不是一行?我知道的唯一方法是使用三个查询:
INSERT INTO Table2 (person, date, foodID) SELECT person, date, 'food1' FROM Table1 WHERE food1;
INSERT INTO Table2 (person, date, foodID) SELECT person, date, 'food2' FROM Table1 WHERE food2;
INSERT INTO Table2 (person, date, foodID) SELECT person, date, 'food3' FROM Table1 WHERE food3;
试试这个:
(SELECT person, date, 'food1' as foodId from table where food1 = true
UNION ALL
SELECT person, date, 'food2' as foodId from table where food2 = true
UNION ALL
SELECT person, date, 'food3' as foodId from table where food3 = true
) ORDER BY person
编辑(回应评论)
如果需要将其放入临时表中,请将查询更改为:
select person, date, FoodId
into #my_temp_table
from (
SELECT person, date, 'food1' as foodId from table where food1 = true
UNION ALL
SELECT person, date, 'food2' as foodId from table where food2 = true
UNION ALL
SELECT person, date, 'food3' as foodId from table where food3 = true
) table_alias
试一试
您可以取消打印数据: 设置:
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');
取消PIVOT查询:
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中这样做?表示应该在表示层完成,而不是在数据操作层 除了架构上的“丑陋”之外,您还将招致一些性能损失:当向客户端返回查询结果时,您的DBMS现在必须传输多达3行,而不是使用简单的布尔值,重复使用
person
和date
,加上食物
表示为字符串而不是布尔值
OTOH,如果你真的想重新设计你的数据模型,并且需要一种将数据从旧模型传输到新模型的方法,那么这是另一回事…Agh,这有点难看。希望有更好的方法,但我会开始编写代码,以防万一没有。谢谢:)看起来另外两个人给出了相同的答案,我会继续做这个。谢谢我怎样才能把它放到临时表中呢?@sooprise我在答案中添加了一个例子。