我有两张桌子三元组和标签
三元组表格包含以下列
id PostID TagID Value
1 1 1 Murder
2 1 2 New Brunswick
3 2 1 Theft
4 2 3 Gun
标签表包含以下列
id TagName
1 Incident
2 Location
3 Weapon
我正在尝试编写sql以创建带有动态标头的数据透视表
输出应该是这样的
PostID Incident Location Weapon
1 Murder New Brunswick
2 Theft Gun
任何编写SQL的帮助都将不胜感激。我在网上看到了一些例子,但是找不到这个例子
答案 0 :(得分:11)
为了转移 MySQL中的数据,您需要同时使用聚合函数和CASE
表达式。
如果您有已知数量的列,则可以对查询进行硬编码:
select p.postid,
max(case when t.tagname = 'Incident' then p.value end) Incident,
max(case when t.tagname = 'Location' then p.value end) Location,
max(case when t.tagname = 'Weapon' then p.value end) Weapon
from triples p
left join tags t
on p.tagid = t.id
group by p.postid;
但是如果你有一个未知数量的列,那么你需要使用一个预准备语句来生成动态SQL:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(CASE WHEN TagName = ''',
TagName,
''' THEN p.value END) AS `',
TagName, '`'
)
) INTO @sql
FROM tags;
SET @sql
= CONCAT('SELECT p.postid, ', @sql, '
from triples p
left join tags t
on p.tagid = t.id
group by p.postid');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
两者都会给出结果:
| POSTID | INCIDENT | LOCATION | WEAPON |
----------------------------------------------
| 1 | Murder | New Brunswick | (null) |
| 2 | Theft | (null) | Gun |