我已经阅读了这篇答案:MySQL - Rows to Columns,并且我已经能够将其应用到我的情况中,直到聚合函数(第三步)。
我正在尝试将以下表格中
我使用了以下代码:
我正在尝试将以下表格中
itemname
的行转换为itemvalue
的列:
hostid | itemname | itemvalue |
---|---|---|
1 | address | 12 street |
2 | so@gmail | |
3 | name | legend |
create view table_extended as (
select
history.*,
case when itemname = "address" then itemvalue end as address,
case when itemname = "email" then itemvalue end as email,
case when itemname = "name" then itemvalue end as name
from history
);
现在我有了table_extended:
主机ID | 项目名 | 项目值 | 地址 | 电子邮件 | 名称 |
---|---|---|---|---|---|
1 | 地址 | 12街道 | 12街道 | NULL | NULL |
1 | 电子邮件 | so@gmail | NULL | so@gmail | NULL |
1 | 名称 | 传奇 | NULL | NULL | 传奇 |
在第3步中,他使用sum
来汇总扩展表,其中所有的值都是整数。我尝试创建另一个视图,使用以下代码,但由于这些是字符串,所以除了主机ID外,所有行都变成0。
create view history_itemvalue_pivot as (
select
hostid,
sum(address) as address,
sum(email) as email,
sum(name) as name
from history_extended
group by hostid
);
它看起来像这样:
主机ID | 地址 | 电子邮件 | 姓名 |
---|---|---|---|
1 | 0 | 0 | 0 |
如何合并所有带有NULL
的行以获得以下结果:
主机ID | 地址 | 电子邮件 | 姓名 |
---|---|---|---|
1 | 12街道 | so@gmail | 传奇 |
MAX()
将按排序规则进行比较,并将NULL从结果集中排除以折叠成单行。否则,看起来很好。 - Michael Berkowskicase when itemname = "address" then itemvalue end as address,
中,你知道如果address
行为空,我该如何分配n/a
吗? - Abdullah Rasheed