SQL - 将行旋转到列并采用笛卡尔积

Posted

技术标签:

【中文标题】SQL - 将行旋转到列并采用笛卡尔积【英文标题】:SQL - Pivot rows to columns and take cartesian product 【发布时间】:2019-01-08 01:06:16 【问题描述】:

我正在尝试仅使用 SQL 查询来执行以下操作。我不太确定如何,但认为我应该使用枢轴和交叉连接?

将第一个表,称为entries,转换为第二个表combined

entries:

study_id     participant    condition_1    condition_2   condition_3

   1          user_1          true            false        false

   1          user_2          true            true         false

   2          user_2          false           false        true

combined:

study_id  user_1condition_1  user_1condition_2  user_1condition_3  user_2condition_1  user_2condition_2 user_2condition_3

   1            true               false              false              true                true               false

   2            N/A                N/A                N/A                false               false              true

我们可以看到这实质上是在一个表格中填充字段,这些字段是参与者与条件的笛卡尔积。但我不确定如何制作新表并使用 SQL 查询填充它。

【问题讨论】:

【参考方案1】:

您可以选择 group by 以及 MAX 逻辑来获得您想要的结果。

select study_id
       ,max(case when participant='user_1' then condition_1 end) as user_1condition_1
       ,max(case when participant='user_1' then condition_2 end) as user_1condition_2
       ,max(case when participant='user_1' then condition_3 end) as user_1condition_3
from entities
group by study_id

【讨论】:

谢谢,你能解释一下这个查询吗?另外我假设需要为用户 2 重复表达式? 是的,对于其他用户,您可以使用相同的 MAX() 模式。在预期结果中,我们有非重复的 study_id,因此我按 study_id 分组。之后,如果参与者是“user_1”,我将选择性地获取条件值,这让我得到了 user_1condition_1,然后我对 condition_2、_3 等重复此操作

以上是关于SQL - 将行旋转到列并采用笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章

工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)

工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)

SQL 不等式加入返回的笛卡尔积

关于笛卡尔积陷阱的实例

SQL笛卡尔积查询与关联查询性能对比

SQL中的笛卡儿积问题和多表连接操作