【问题标题】:SQL Update multiple values with a group by statement not workingSQL使用group by语句更新多个值不起作用
【发布时间】:2015-12-08 11:48:42
【问题描述】:

我已经尝试检查类似的帖子,但无法正确解决这个问题,请帮助。

此查询返回正确的数据,但更新语句抱怨,因为它说的不止

SELECT 
    classificationchartofaccountname, 
    -SUM(ISNULL(HLD.Nominal, 0))  AS 'Total' 
FROM
    [dbsFPM].[dbo].[rpt_Holdings] HLD 
INNER JOIN 
    [dbsFPM].[dbo].[rpt_FundAccounts] FA ON HLD.Username = FA.Username 
                                         AND HLD.ClientPortfolioCode = FA.ClientPortfolioCode 
                                         AND FA.ClassificationChartOfAccountName = HLD.InstrumentName 
WHERE 
    HLD.username =  @username 
    AND FA.Username = @username 
    AND FA.Narration = 'IncomeStatement' 
    AND FA.AccountType = 'Expense'  
GROUP BY 
    ClassificationChartOfAccountName)

返回:

classificationchartofaccountname    Total

General Expenses on ZAR 17578.38

lc Audit 2014 on ZAR    6533.12

lc Trustee Fees - Other on ZAR  840.41

lc Trustee Fees-ZAR 38524.34

Management Fees-ZAR 6452680.040

Performance Fees-ZAR    175.80

我想用的update语句出错出来如下:

消息 512,第 16 级,状态 1,第 1 行
子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。

这里是更新:

UPDATE [rpt_FundAccounts]
SET ReconNarration = 'ExpenseAnalysis_Period', 
    Recon = (SELECT -SUM(ISNULL(HLD.Nominal, 0)) 
             FROM [dbo].[rpt_Holdings] HLD 
             INNER JOIN [dbo].[rpt_FundAccounts] FA ON HLD.Username = FA.Username 
                                                    AND HLD.ClientPortfolioCode = FA.ClientPortfolioCode 
                                                    AND FA.ClassificationChartOfAccountName = HLD.InstrumentName 
             WHERE HLD.username =  @Username 
               AND FA.Username = @Username 
               AND FA.Narration = 'IncomeStatement' 
               AND FA.AccountType = 'Expense' 
               /* and ClassificationChartOfAccountName = 'Management Fees-ZAR'*/ 
             GROUP BY ClassificationChartOfAccountName)
WHERE 
    username = @username  
    AND Narration = 'IncomeStatement' 
    AND AccountType = 'Expense' 
    /*and ClassificationChartOfAccountName = 'Management Fees-ZAR' */

问题是我想用来自[rpt_Holdings]的各自总数更新所有ClassificationChartOfAccountNames

请帮忙,对不起,我还是个初学者!

ClassificationChartOfAccountName

Bank Charge Fees on GBP
Bank_Interest Charges on ZAR
Distribution Paid
Expenses
Foreign Withholding Tax
General Expenses on EUR
General Expenses on USD
General Expenses on ZAR
lc Audit 2012 on ZAR
lc Audit 2013 Final on ZAR
lc Audit 2013 on ZAR
lc Audit 2014 on ZAR
lc Scrip - SBSA on ZAR
lc Trustee Fees - Other on ZAR
lc Trustee Fees-ZAR
Management Fees-ZAR
Performance Fees-ZAR
Realised Foreign Exchange Gain
Realised GainLoss
Realised Pull To Par

【问题讨论】:

  • 标记使用的 dbms。 (看起来不像 ANSI SQL...)
  • 使用更新作为 UPDATE FA
  • 建议的答案只是导致无法绑定多部分标识符,如果我添加回连接,那么它看起来与我所拥有的没有什么不同。有效的方法是有一个 where 语句,其中包含每个特定 ClassificationChartofAccountName 的 where ,但这似乎是一个非常糟糕的主意,用不同的硬编码 ClassificationChartofAccountName 说 20 次相同的语句,并且也不会获取任何新的 ClassificationChartofAccountNam。所以不幸的是仍然卡住了

标签: sql sql-server tsql


【解决方案1】:

这里的问题在于子查询中的GROUP BY 语句。它使它输出的不是一个 SUM 值,而是一个包含每个 ClassificationChartOfAccountName 的 SUM 的表。但是你不能用 TABLE 更新标量值,你会得到错误 - Subquery returned more than 1 value

如果您想根据行的ClassificationChartOfAccountName 使用 SUM 更新表,您应该在更新的表行和子查询之间建立链接。所以子查询只输出一个值。 我认为应该是这样的:

UPDATE [rpt_FundAccounts] FA 
SET ReconNarration = 'ExpenseAnalysis_Period', 
    Recon = (select -sum(isnull(HLD.Nominal,0)) 
             from [dbo].[rpt_Holdings] HLD 
             WHERE  HLD.Username =  FA.Username 
                    and HLD.ClientPortfolioCode = FA.ClientPortfolioCode 
                    and FA.ClassificationChartOfAccountName = HLD.InstrumentName
             )
WHERE username = @username  
      and Narration = 'IncomeStatement' 
      and AccountType = 'Expense' 

【讨论】:

  • 建议的答案只是导致无法绑定多部分标识符,如果我添加回连接,那么它看起来与我所拥有的没有什么不同。有效的方法是有一个 where 语句,其中包含每个特定 ClassificationChartofAccountName 的 where ,但这似乎是一个非常糟糕的主意,用不同的硬编码 ClassificationChartofAccountName 说 20 次相同的语句,并且也不会获取任何新的 ClassificationChartofAccountNam。所以不幸的是仍然卡住了
  • @Newby101 您不必将您加入回此声明。这里FA别名是更新后的表[rpt_FundAccounts](看第一行)。
  • "无法绑定多部分标识符。
  • @Newby101:检查您在查询中使用的所有字段名称是否都有您用来识别它们的别名。例如,如果您使用 JOIN,则两个表中的字段可以具有相同的名称,在这种情况下您必须使用别名,如下例所示:HLD.Username = FA.Username
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 2012-08-26
  • 1970-01-01
  • 2021-12-24
  • 2017-01-13
  • 2017-12-23
  • 1970-01-01
相关资源
最近更新 更多