SQL Server - 尝试对我的表进行非规范化

标签 sql sql-server join

对标题表示歉意,但我正在尝试做超出我水平的事情,甚至让我来解释它。

假设我有一个包含变量 person、foodstuff 和 amount 的表:

 Person  food     Amount
 Mike    Butter   3
 Mike    Milk     4
 Mike    Chicken  2
 Tim     Milk     4
 John    Chicken  2

通过在查询中将表与其自身连接起来,我成功地创建了一个列表,其中食物是新变量的基础,值是数量。上表将变为:

Person  Butter Milk Chicken
Mike    3      4    2

代码大约是:

Select 
    a.person, 
    b.amount as Butter,
    c.amount as Milk, 
    d.amount as Chicken
from PersonFoodAmount a
inner join PersonFoodAmount b on a.person = b.person
inner join PersonFoodAmount c on a.person=c.person
where b.food='Butter' 
and c.food='Milk'
and d.food='Chicken'

现在,这给了我迈克,因为他勾选了所有复选框。但我还需要部分匹配:

Person  Butter Milk Chicken
Mike    3      4    2
Tim     NULL   4    NULL
John    NULL   Null 2

我尝试过各种连接,包括完全外部连接,但我仍然只找到冰箱装满的人。

有什么建议吗?

最佳答案

您可以使用 Pivot 来实现此目的。

DECLARE @PersonStuff TABLE (Person varchar(10), Food varchar(10), Amount INT)

INSERT INTO @PersonStuff VALUES
('Mike','Butter', 3),
('Mike','Milk', 4),
('Mike','Chicken', 2),
('Tim','Milk', 4),
('John','Chicken', 2)

SELECT 
    * 
FROM ( 
    SELECT 
        * 
    FROM @PersonStuff ) AS SourceTable
PIVOT ( 
    AVG(Amount) 
    FOR Food IN ( [Butter],[Milk],[Chicken] ) 
) AS PivotTable

结果:

Person  Butter  Milk    Chicken
John    NULL    NULL    2
Mike    3       4       2
Tim     NULL    4       NULL

关于SQL Server - 尝试对我的表进行非规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45920094/

相关文章:

java - Mysql在Java中插入查询

mysql - 使用查询将日期转换为长整型

asp.net - 搜索具有逗号分隔值的列

MySQL查询求和另一个表中的值

javascript - 如何在 Azure Cosmos DB 中编写 JavaScript 存储过程以从 SQL API 返回数据

mysql - 选择查询算术计算

mysql查询连接,比较两个表并返回第一个表中的所有记录

sql - 按两列的最小值排序

join - 从一个“join”表到另一个“join”表的SqlAlchemy关系

SQL。如何正确组合子查询和连接?