SQLServer 子查询单元作为列



我正在尝试将子查询作为带有条件的列。

我从SQL Server得到的错误是:

子查询返回了 1 个以上的值。当子查询跟在 =、!=、<、<= 、>、>= 后面或子查询用作表达式时,不允许这样做。

我正在选择更多列,但这是给出 ma 错误的主要查询:

SELECT ItemNo, Channel, Brand, TotalUnits,
       (SELECT TotalUnits FROM Table1 WHERE Locked = 1) As LockedUnits
FROM Table1

编辑:锁定是0或1

理想情况下,查询将返回以下内容(LockedUnits 始终是 TotalUnit 的子集):

ItemNO   Channel   Brand    TotalUnits    LockedUnits
1        5         Adidas   100           80
2        7         Nike     500           360

看起来您要做的是仅对那些Locked = 1 的行获取TotalUnits。如果是这种情况,您最好使用 case

SELECT ItemNo, Channel, Brand, TotalUnits,
       case when Locked = 1 then TotalUnits else null end As LockedUnits
FROM Table1
您可以使用子选择

来执行此操作,但您需要将子选择连接到主查询。假设ItemNo是唯一的,它看起来像这样:

SELECT ItemNo, Channel, Brand, TotalUnits,
       (SELECT TotalUnits FROM Table1 t2 WHERE Locked = 1
        WHERE t1.itemno = t2.itemno) As LockedUnits
FROM Table1 t1

当然,点击一个表两次以获取已在要返回的行中的值有点愚蠢。


注释响应:您唯一希望子选择的情况是,您要从其他表或同一表中的不同行获取数据。而且,即便如此,我更喜欢将表放在 where 子句中并正常将其连接到主表。

尝试将 SELECT sum(TotalUnits) 放入子查询中

必须将子查询限制为单个结果,否则无法在结果集列中返回该子查询。 您需要按 SUM(总单位)、选择"前 1 个"或"非重复"将结果缩小到单个记录。

SELECT ItemNo, Channel, Brand, TotalUnits,
   (SELECT sum(TotalUnits) FROM Table1 WHERE Locked = 1) As LockedUnits
FROM Table1
group by ItemNo, Channel, Brand, TotalUnits

最新更新