这是与我原来的问题相关的问题
表中的数据现在保存为
我有两张桌子三元组和标签
Triples Table has the following Columns
id PostID TagID Value
1 1 1 Murder
2 1 1 Theft
3 2 2 Knife
4 2 2 Gun
标签表包含以下列
id TagName
1 Incident
2 Weapon
我正在尝试编写sql以创建带有动态标头的数据透视表
输出应该是这样的
PostID Incident Weapon
1 Murder,Theft
2 Knifie,Gun
我为此编写了一个低效且部分的sql查询,任何写这个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('CREATE VIEW PostTags as SELECT p.postid, p.id, ', @sql, '
from triples p
left join tags t
on p.tagid = t.id
group by p.postid, p.id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
答案 0 :(得分:1)
您必须构建两个字符串,一个用于内部旋转以创建Incident
和Weapon
的列,第二个字符串使用GROUP_CONCAT
用于外部查询:< / p>
SET @sql = NULL;
SET @sql2 = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'group_concat(',
TagName,
' separator '', '') as `',
TagName, '`'
)
)
INTO @sql2
FROM tags;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(CASE WHEN TagName = ''',
TagName,
''' THEN p.value END) AS `',
TagName, '`'
)
)
INTO @sql
FROM tags;
SET @sql = CONCAT('select postid, ', @sql2, '
from
(
SELECT p.postid, p.id, ', @sql, '
from triples p
left join tags t
on p.tagid = t.id
group by p.postid, p.id
) d
group by postid');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这是创建SQL代码:
select postId,
group_concat(incident separator ', ') incident,
group_concat(Weapon separator ', ') Weapon
from
(
SELECT p.postid, p.id,
max(CASE WHEN TagName = 'Incident' THEN p.value END) AS `Incident`,
max(CASE WHEN TagName = 'Weapon' THEN p.value END) AS `Weapon`
from triples p
left join tags t
on p.tagid = t.id
group by p.postid, p.id
) d
group by postId;