sql - 使用 SUM 和 Group BY 的 T-SQL 更新

标签 sql sql-server-2008 tsql

我想用这个查询中的值进行更新,但它说它返回多个值。

UPDATE PO_HEADER
  SET TOTAL = (SELECT SUM(LINE_TOTAL) AS "NEW_LINE_TOTAL" 
  FROM PO_LINE pl, PO_HEADER ph 
  where ph.IC_PO_HEADER = pl.IC_PO_HEADER 
  and ph.RELEASE_NUMBER = pl.RELEASE_NUMBER 
  group by pl.IC_PO_HEADER,pl.FOREIGN_KEY,ph.RELEASE_NUMBER,
  ph.REVISION_NUMBER,ph.PO_NUMBER)
from PO_HEADER ph, PO_LINE pl
where ph.IC_PO_HEADER = pl.IC_PO_HEADER;

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.



它如何返回不止一列?

最佳答案

如果此查询返回您想要的信息:

SELECT *, LINE_TOTAL = SUM(l.LINE_TOTAL) OVER 
    (PARTITION BY l.IC_PO_HEADER, l.RELEASE_NUMBER)
  FROM dbo.PO_HEADER AS h
  INNER JOIN dbo.PO_LINE AS l
  ON h.IC_PO_HEADER = l.IC_PO_HEADER 
  AND h.RELEASE_NUMBER = l.RELEASE_NUMBER;

那么这可能是您想要的 UPDATE 查询:
;WITH x AS
(
  SELECT h.TOTAL, lt = SUM(l.LINE_TOTAL) OVER 
    (PARTITION BY l.IC_PO_HEADER, l.RELEASE_NUMBER)
  FROM dbo.PO_HEADER AS h
  INNER JOIN dbo.PO_LINE AS l
  ON h.IC_PO_HEADER = l.IC_PO_HEADER 
  AND h.RELEASE_NUMBER = l.RELEASE_NUMBER
)
UPDATE x SET TOTAL = lt;

我不得不同意戈登,你的分组看起来很奇怪。我不确定我是否做对了(这就是为什么我强烈建议您先运行 SELECT)。

关于sql - 使用 SUM 和 Group BY 的 T-SQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909786/

相关文章:

mysql - 如何一次在所有数据库上运行 sql 命令?

sql - 临时表还是永久表?

sql - 如何创建一个简洁的 SQL 'Check Constraint',禁止所有字符串字段使用某些字符?

sql - 如何为 SQL 表中的每一项运行 Insert 语句?

mysql - sql 表结果带有结果前缀

mysql - 如何在 MySQL 中搜索 json 值数组上的数据

sql - 从连接行中选择不同的字段

sql - 在 SQL Server 中创建 XML 时,如何将值包装在 CDATA 标记中?

sql - 如何将列转换为行?

mysql - 显示在所选字段中匹配的 WHERE 条件值