每个键将多行压缩为一行
Crunching multiple rows into one per key
我正在检索产品的多项功能,并希望将它们显示在一行中。这是我目前正在检索的内容:
key waterproof oilfree parabenfree
183 1 null null
766 null 0 null
766 null null 0
991 null 0 null
991 null null 0
一个产品可能有零个或多个功能。我的目标是像这样检索它们:
key waterproof oilfree parabenfree
183 1 null null
766 null 0 0
991 null 0 0
查询的 table 看起来像下面的 qualifier
定义了特征的类型。
key qualifier value
171 waterproof 1
766 oilfree 0
766 parabenfree 1
991 parabenfree 0
991 oilfree 0
在 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
我们能否在保持所需结构的同时将这些行压缩为每个产品一行?
这是一个可重现的例子:
-- 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
您可以使用 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];
我正在检索产品的多项功能,并希望将它们显示在一行中。这是我目前正在检索的内容:
key waterproof oilfree parabenfree
183 1 null null
766 null 0 null
766 null null 0
991 null 0 null
991 null null 0
一个产品可能有零个或多个功能。我的目标是像这样检索它们:
key waterproof oilfree parabenfree
183 1 null null
766 null 0 0
991 null 0 0
查询的 table 看起来像下面的 qualifier
定义了特征的类型。
key qualifier value
171 waterproof 1
766 oilfree 0
766 parabenfree 1
991 parabenfree 0
991 oilfree 0
在 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
我们能否在保持所需结构的同时将这些行压缩为每个产品一行?
这是一个可重现的例子:
-- 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
您可以使用 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];