当前位置: 首页 > 面试题库 >

使用SUM和Group BY进行T-SQL更新

裘嘉木
2023-03-14
问题内容

我想使用此查询中的值进行更新,但这意味着它返回多个值。

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;

消息512,级别16,状态1,行1
子查询返回的值大于1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

它如何返回不止一列?


问题答案:

如果此查询返回所需的信息:

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(MSSQL 2008)语句来选择运行总计: 这将给我如下结果: 现在可以只为每个用户检索最新的行吗?因此结果将是: 我要这样做正确吗?任何建议或遵循的新路径都将是很棒的! 问题答案: 试试这个: SQL小提琴演示

  • 问题内容: 我想在日期基础上更新一行。问题是,由于我的错误,我有两行相同的数据。如何仅在一行上运行更新? 问题答案: 表通常具有唯一的ID。您应该对此进行过滤。 例如, 如果您的表没有唯一的ID,请考虑添加一个:带有和的列。

  • 我有以下代码块可以正常工作; 这给了我2个错误; 错误%1“System.Collections.ObjectModel.ObservableCollection.ObservableCollection(System.Collections.Generic.List)”的最佳重载方法匹配包含一些无效参数 错误2参数1:无法从“System.Linq.IQueryable>”转换为“System.

  • 当我分组和求和时,我怎样才能绕过这个并保留C栏呢?

  • 我有一堆数据帧,我连接成一个大数据帧。所有行都有一个datetime、一个名称,然后是一些具有随机值的列,例如,数据帧可以如下所示: 现在,我需要按对这些行进行分组,并将它们分成60分钟的bins,我目前的做法如下: 这可以用任何方式来完成吗?或者我必须将我的数据帧一分为二,然后在之后加入?

  • 我有列表有字段名称,货币和金额。我想按名称、货币和金额来分组。 我想要列表中的结果/输出