在 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_loginprofile_complete 列应包含在最终结果中的哪些值。 1) 特定用户的“first_login”和“profile_complete”没有多行activity_name 2)如果值存在则显示date_completed,否则显示“N/A” 【参考方案1】:

您可以按如下方式再使用 2 个LEFT OUTER JOINs,并使用CASE 在结果中选择所需的表达式。请注意,这里我认为date_completeddate 列。如果是字符列,则不需要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) 查询

如屏幕截图中所述,我想在 SQL 中创建一个数据透视表 [重复]

在 Postgres 9.6 中创建数据透视表

SQL 数据透视表动态

在R中创建“数据透视表”,每行填充因子值

“常规”数据透视表和 olap 类型数据透视表之间的区别