如何使用保存在 table 中的水平数据作为 postgres 中的列
How to use Horizontal data saved in a table as Columns in postgres
我有一个 table 这样的:
Table VR
ID Key Value Date
123 First_Name Vlad 01-01-2011
234 First_Name Jim 07-01-2011
456 First_Name Olimpia 10-02-2012
123 Last_Name Kofman 12-02-2014
234 Last_Name Cramer 14-02-2014
456 Last_Name Dukakis 04-03-2015
123 Dept IT 08-03-2016
234 Dept Marketing
456 Dept Accounting
123 Sex M
234 Sex M
456 Sex F
现在,我想编写一个查询来获取 First_Name ='Vlad' AND Last_Name='Cramer' 的值。
另一个场景是我想获取日期“01-01-2011”到“14-02-2016”之间的所有记录。
我写的查询是:
SELECT VR.key,
Min(( CASE
WHEN ( VR.key = 'FIRST_NAME' ) THEN
VR.value
ELSE 'n/a'
END )) AS first_name,
Min(( CASE
When ( VR.key = 'LAST_NAME' ) THEN
VR.value
ELSE 'n/a'
END )) AS last_name
FROM VR
WHERE ( ( VR.first_name = 'Vlad' )
AND ( VR.last_name = 'Cramer' ) )
GROUP BY VR.key
ORDER BY VR.first_name,
VR.last_name
我遇到的异常是 Amazon](500310) 无效操作:列 VR.first_name 不存在;
任何人都可以帮助我知道我应该如何达到预期的结果。
您的 table 没有名为 first_name
或 last_name
的列 - 这些是 key
列中的值。
我认为您实际上是在寻找条件聚合:
select id
from vr
where key in ('First_Name', 'Last_Name')
group by id
having
max(case when key = 'First_Name' and value = 'Vlad' then 1 end) = 1
and max(case when key = 'Last_Name' and value = 'Cramer' then 1 end) = 1
这会给你 id
个名字等于 Vlad 和姓氏等于 Cramer 的人。
您应该从您的 VR Table 构建一个常规 table 并将其作为起点进行查询或从内部 SELECT
构建视图
SELECT
*
FROM
(SELECT
VR.id,
MAX(IF(VR.key = 'First_Name', VR.Value, NULL)) 'First_Name',
MAX(IF(VR.key = 'Last_Name', VR.Value, NULL)) 'Last_Name',
MAX(IF(VR.key = 'Dept', VR.Value, NULL)) 'Dept',
MAX(IF(VR.key = 'Sex M', 'male', IF(VR.key = 'Sex F', 'female', NULL))) 'Gender'
FROM
VR
GROUP BY VR.id) comp
WHERE
First_Name = 'Vlad'
AND Last_Name = 'Kofman';
id | First_Name | Last_Name | Dept | Gender
--: | :--------- | :-------- | :--- | :-----
123 | Vlad | Kofman | IT | male
db<>fiddle here
我有一个 table 这样的:
Table VR
ID Key Value Date
123 First_Name Vlad 01-01-2011
234 First_Name Jim 07-01-2011
456 First_Name Olimpia 10-02-2012
123 Last_Name Kofman 12-02-2014
234 Last_Name Cramer 14-02-2014
456 Last_Name Dukakis 04-03-2015
123 Dept IT 08-03-2016
234 Dept Marketing
456 Dept Accounting
123 Sex M
234 Sex M
456 Sex F
现在,我想编写一个查询来获取 First_Name ='Vlad' AND Last_Name='Cramer' 的值。 另一个场景是我想获取日期“01-01-2011”到“14-02-2016”之间的所有记录。
我写的查询是:
SELECT VR.key,
Min(( CASE
WHEN ( VR.key = 'FIRST_NAME' ) THEN
VR.value
ELSE 'n/a'
END )) AS first_name,
Min(( CASE
When ( VR.key = 'LAST_NAME' ) THEN
VR.value
ELSE 'n/a'
END )) AS last_name
FROM VR
WHERE ( ( VR.first_name = 'Vlad' )
AND ( VR.last_name = 'Cramer' ) )
GROUP BY VR.key
ORDER BY VR.first_name,
VR.last_name
我遇到的异常是 Amazon](500310) 无效操作:列 VR.first_name 不存在;
任何人都可以帮助我知道我应该如何达到预期的结果。
您的 table 没有名为 first_name
或 last_name
的列 - 这些是 key
列中的值。
我认为您实际上是在寻找条件聚合:
select id
from vr
where key in ('First_Name', 'Last_Name')
group by id
having
max(case when key = 'First_Name' and value = 'Vlad' then 1 end) = 1
and max(case when key = 'Last_Name' and value = 'Cramer' then 1 end) = 1
这会给你 id
个名字等于 Vlad 和姓氏等于 Cramer 的人。
您应该从您的 VR Table 构建一个常规 table 并将其作为起点进行查询或从内部 SELECT
构建视图SELECT
*
FROM
(SELECT
VR.id,
MAX(IF(VR.key = 'First_Name', VR.Value, NULL)) 'First_Name',
MAX(IF(VR.key = 'Last_Name', VR.Value, NULL)) 'Last_Name',
MAX(IF(VR.key = 'Dept', VR.Value, NULL)) 'Dept',
MAX(IF(VR.key = 'Sex M', 'male', IF(VR.key = 'Sex F', 'female', NULL))) 'Gender'
FROM
VR
GROUP BY VR.id) comp
WHERE
First_Name = 'Vlad'
AND Last_Name = 'Kofman';
id | First_Name | Last_Name | Dept | Gender --: | :--------- | :-------- | :--- | :----- 123 | Vlad | Kofman | IT | male
db<>fiddle here