SQLServer子查询单位为列

时间:2012-12-13 22:53:47

标签: sql sql-server

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

我从SQL Server得到的错误是:

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

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

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

编辑:已锁定为0或1值

理想情况下,查询会返回此值(LockedUnits始终是TotalUnits的子集):

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

4 个答案:

答案 0 :(得分:5)

您尝试执行的操作似乎仅针对TotalUnits的行Locked = 1。如果是这种情况,最好使用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子句中并通常将它连接到主表。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您必须将子查询限制为单个结果,否则无法在结果集列中返回。您需要通过SUM(TotalUnits),SELECT TOP 1或SELECT DISTINCT将结果缩小到单个记录。

答案 3 :(得分:0)

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