在 sql 中创建一个带联接的数据透视表
Posted
技术标签:
【中文标题】在 sql 中创建一个带联接的数据透视表【英文标题】:Create a pivot with joins in sql 【发布时间】:2017-09-07 02:42:50 【问题描述】:我正在使用 Psql,需要通过创建数据透视表从名为 activities
的表中获取值。
目前我有一个这样的查询,它会生成一个包含 first_name|email|signup_hash
列的表:
SELECT COALESCE(profile.first_name, signup_hash.first_name) AS first_name,
users.email,
signup_hash.hash_id,
FROM signup_hash
LEFT OUTER JOIN users ON users.id = signup_hash.user_id
LEFT OUTER JOIN profiles ON profiles.user_id = users.id
INNER JOIN memberships ON memberships.hash_id = signup_hash.hash_id
WHERE memberships.member_id =?
activities
表具有如下字段:user_id|activity_name|date_completed|date_created
每个用户都有activity_name
为“first_login”和“profile_complete”的活动(例如,activity.name="first_login" 和 activity.name="profile_complete)。
我将如何加入活动表,以便最终查询生成一个包含列的表:first_name|email|first_login|profile_complete|signup_hash
?
编辑 1)对于特定用户,没有多行“first_login”和“profile_complete”的activity_name 2) first_login 和 profile_complete 列在最终结果中应该包含哪些值?如果值存在则显示 date_completed,否则显示“N/A”
【问题讨论】:
对于特定用户,“first_login”和“profile_complete”是否存在多行activity_name
?在activities
表中。 first_login
和 profile_complete
列应包含在最终结果中的哪些值。
1) 特定用户的“first_login”和“profile_complete”没有多行activity_name 2)如果值存在则显示date_completed,否则显示“N/A”
【参考方案1】:
您可以按如下方式再使用 2 个LEFT OUTER JOIN
s,并使用CASE
在结果中选择所需的表达式。请注意,这里我认为date_completed
是date
列。如果是字符列,则不需要TO_CHAR
。
SELECT COALESCE(profile.first_name, signup_hash.first_name) AS first_name,
users.email,
CASE
WHEN f_login.user_id IS NULL THEN 'N/A'
ELSE TO_CHAR(date_completed)
END first_login,
CASE
WHEN p_complete.user_id IS NULL THEN 'N/A'
ELSE TO_CHAR(date_completed)
END profile_complete,
signup_hash.hash_id
FROM signup_hash
LEFT OUTER JOIN users ON users.id = signup_hash.user_id
LEFT OUTER JOIN profiles ON profiles.user_id = users.id
INNER JOIN memberships ON memberships.hash_id = signup_hash.hash_id
LEFT OUTER JOIN
(SELECT user_id,
date_completed
FROM activities
WHERE activity_name = 'first_login') f_login ON f_login.user_id = signup_hash.user_id
LEFT OUTER JOIN
(SELECT user_id,
date_completed
FROM activities
WHERE activity_name = 'profile_complete') p_complete ON p_complete.user_id = signup_hash.user_id
WHERE memberships.member_id = ?
【讨论】:
这不会创建有 7 列的表吗?first_name|email|user_id|first_login|user_id|profile_complete|signup_hash
没有。你对它有什么要求?
好的,我看到了“案例”。这应该有效。唯一的问题是 user_id 永远不会为空,所以我认为应该是:WHEN f_login.date_completed IS NULL THEN 'N/A'
所以。您需要单独或一起检查这两个条件吗?以上是关于在 sql 中创建一个带联接的数据透视表的主要内容,如果未能解决你的问题,请参考以下文章
在 LibreOffice Base 中创建等效数据透视表的 SQL (HSQLDB) 查询