我试图得到一个具体的结果,但到目前为止,我的try 给出了一个不想要的结果或一个错误.

SELECT u.Id 
      ,(SELECT c.Content FROM Contents c WHERE c.Month = '01' AND u.Id = c.Id) 'Month_1_Content'
      ,(SELECT c.Content FROM Contents c WHERE c.Month = '02' AND u.Id = c.Id) 'Month_2_Content'
      ,(SELECT c.Content FROM Contents c WHERE c.Month = '03' AND u.Id = c.Id) 'Month_3_Content'     
  FROM Users u;

给出错误

子查询返回多个值.当子查询跟随在=、!=、<、<=、>、>=之后,或子查询用作表达式时,不允许这样做.

我也试

SELECT u.Id 
      ,c.Content 'Month_1_Content'
      ,d.Content 'Month_2_Content'
      ,e.Content 'Month_3_Content'
  FROM Users u
  LEFT OUTER JOIN Content c 
    ON c.Month = '01' AND u.Id= c.Id
  LEFT OUTER JOIN Content d 
    ON d.Month = '02' AND u.Id= d.Id
  LEFT OUTER JOIN Content e 
    ON e.Month = '03' AND u.Id= e.Id

但此查询不会返回目标结果.

Query Result that I want to get

-------------------------------------------------------------
   Id   | Month_1_Content | Month_2_Content | Month_3_Content
-------------------------------------------------------------
 scott  |    01_scott_1   |    02_scott_1   |
 scott  |    01_scott_2   |                 |
 tiger  |                 |    02_tiger_1   |    03_tiger_1   
 tiger  |                 |    02_tiger_2   |    03_tiger_2  
 tiger  |                 |                 |    03_tiger_3   
 cat    |                 |                 | 
-------------------------------------------------------------

样本数据

Table Users

Users
-----
 Id
-----
scott
tiger
cat
-----

Table Contents

Contents
--------------------------------------
Month |   Id   | Sequence |  Content
--------------------------------------
01    | scott  |    1     | 01_scott_1
01    | scott  |    2     | 01_scott_2
02    | scott  |    1     | 02_scott_1
02    | tiger  |    1     | 02_tiger_1
02    | tiger  |    2     | 02_tiger_2
03    | tiger  |    1     | 03_tiger_1
03    | tiger  |    2     | 03_tiger_2
03    | tiger  |    3     | 03_tiger_3
--------------------------------------

推荐答案

您直接的问题是非常清楚的错误消息Subquery returned more than 1 value,这很明显意味着您有一个返回多个值的子查询.

您可以使用TOP 1或某种形式的聚合让它返回单个值,但这不会得到您想要的结果.

您实际想要的是以Id, Sequence为轴心,每Month返回Content.

您可以使用PIVOT运算符,但透视的最佳方法是使用MAX(CASE手动透视

SELECT
  u.Id ,
  c.*
FROM Users u
OUTER APPLY (
    SELECT
      MAX(CASE WHEN c.Month = '01' THEN c.Content END) AS Month_1_Content,
      MAX(CASE WHEN c.Month = '02' THEN c.Content END) AS Month_2_Content,
      MAX(CASE WHEN c.Month = '03' THEN c.Content END) AS Month_3_Content
    FROM Content c 
    WHERE u.Id = c.Id
    GROUP BY
      c.Sequence
) c;

APPLY通常是预聚合的好方法,尽管您也可以使用普通连接来实现这一点

SELECT
  u.id,
  c.*
FROM Users u
LEFT JOIN (
    SELECT
      c.id,
      MAX(CASE WHEN c.Month = '01' THEN c.Content END) AS Month_1_Content,
      MAX(CASE WHEN c.Month = '02' THEN c.Content END) AS Month_2_Content,
      MAX(CASE WHEN c.Month = '03' THEN c.Content END) AS Month_3_Content
    FROM Content c
    GROUP BY
      c.Id,
      c.Sequence
) c ON u.Id = c.Id;

db<>fiddle

Sql相关问答推荐

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

如何用3个(半)固定位置建模团队,并有效地搜索相同/不同的团队?

SQL查询每个客户的最新条目

如何在不更改S代码的情况下,判断存储过程调用了多少次clr函数?

如何根据计数和分组获取订单总数

如何在PostgreSQL中对第1,1,1,1,2,2,2,2行进行编号

SQL:如何取上一年的平均值?

查询每周数据(周一至周日),避免年度日期重叠

明细表中没有记录如何更新主表的值为0

在同一列上迭代时计算持续时间

group by 并根据同表中其他列的某些条件获取 group by 中的某一列值

连续天跟踪购买情况(将标记返回到另一列?)

根据要过滤的列的值进行联接和分组

PostgreSQL中如何提取以特定字符开头的字符串中的所有单词?

批量更改WooCommerce中所有产品的税收状态

从 varchar 列中删除特殊字符后的前面的零和字符时遇到问题

将有效数字作为 varchar 返回的 SQL 函数

pyspark 将列转换为行

当我按 PK 分组时,该表中的所有列在每个组中都具有相同的值.那么为什么 SQL Server 需要对这些列进行聚合呢?