将多行压缩为每个键一行

Bra*_*ayn 1 t-sql sql-server

我正在检索产品的多个功能,并希望将它们显示在一行中。这是我目前正在检索的内容:

key     waterproof     oilfree     parabenfree
183     1              null        null
766     null           0           null
766     null           null        0
991     null           0           null 
991     null           null        0
Run Code Online (Sandbox Code Playgroud)

一个产品可能有零个或多个功能。我的目标是像这样检索它们:

key     waterproof     oilfree     parabenfree
183     1              null        null
766     null           0           0
991     null           0           0 
Run Code Online (Sandbox Code Playgroud)

查询的表类似于下面的表,其中qualifier定义了功能类型。

key    qualifier      value
171    waterproof     1
766    oilfree        0
766    parabenfree    1
991    parabenfree    0    
991    oilfree        0
Run Code Online (Sandbox Code Playgroud)

在 a 中CASE WHEN,我正在为每个功能创建一个列。当条件满足时,我想查看该产品的价值。但是,每行定义一个功能,这意味着可以为产品检索多行。

SELECT 
    CASE WHEN f.qualifier LIKE '%waterproof%'
        THEN f.value END as waterproof,
        
    CASE WHEN f.qualifier LIKE '%parabenfree%'
        THEN f.value END as parabenfree,
        
    CASE WHEN f.qualifier LIKE '%oilfree%'
        THEN f.value END as oilfree
FROM 
    features f
Run Code Online (Sandbox Code Playgroud)

我们是否能够将这些行压缩为每个产品一个,同时保持所需的结构?

这是一个可重现的示例:

-- create table
CREATE TABLE features (
  key INTEGER,
  qualifier TEXT,
  value INTEGER
);
-- insert data
INSERT INTO features VALUES (183, 'waterproof', 1),
                            (766, 'oilfree', 0),
                            (766, 'oilfree', 1),
                            (991, 'parabenfree', 0),
                            (991, 'parabenfree', 1);

-- statement
SELECT 
    f.key,
    CASE WHEN f.qualifier LIKE '%waterproof%'
        THEN f.value END as waterproof,

    CASE WHEN f.qualifier LIKE '%parabenfree%'
        THEN f.value END as parabenfree,

    CASE WHEN f.qualifier LIKE '%oilfree%'
        THEN f.value END as oilfree
FROM 
    features f
Run Code Online (Sandbox Code Playgroud)

在线版本: https: //www.mycompiler.io/view/83oxmgk

Stu*_*Stu 7

您可以使用max()聚合结果以消除空值,例如:

select f.[key],
    Max(case when f.qualifier like '%waterproof%' then f.value end  ) as waterproof,
    Max(case when f.qualifier like '%parabenfree%' then f.value end ) as parabenfree,
    Max(case when f.qualifier like '%oilfree%' then f.value end     ) as oilfree 
from features f
group by f.[key];
Run Code Online (Sandbox Code Playgroud)