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我在答案中添加了一个例子。