【问题标题】:Error converting data type nvarchar to numeric convert/cast将数据类型 nvarchar 转换为数字转换/转换时出错
【发布时间】:2020-11-22 12:30:50
【问题描述】:

我怀疑这与报告ClientName 有关,它是nvarchar 数据类型。 AUMidnchar。我不确定如何在不更改数据类型的情况下解决此问题(我不希望这样做)。

SELECT 
    Clients.ClientName, AUM.ManagementFee, 
    SUM(AUM.ManagementFee * AUM.AUM) AS Management_Fee
FROM
    AUM
JOIN 
    Clients ON AUM.AUMid = Clients.AUMid
GROUP BY 
   Clients.ClientName, AUM.ManagementFee

我需要显示Clients.ClientName。它通过AUM.AUMid 链接到AUM 表。

CREATE TABLE Clients 
(
    ClientID nvarchar(50),
    ClientName nvarchar(50)
    AccountID nchar(10),
    AUMid nchar(10)
);

CREATE TABLE AUM
(
    AUMid nchar(10),
    AUM nvarchar(max),
    ManagementFee(decimal(9,4)
);

删除SUM(AUM.AUM * AUM.ManagementFee) AS Management_Fee 允许执行查询。

【问题讨论】:

  • 请提供一些示例数据。
  • AUMid = 1 AUM = 18,431,221.11 ManagementFee = 0.0125 ClientName = Allegany Fire Department
  • 您是否有任何列已被定义为文本,但其中包含数字数据?
  • 我不这么认为。
  • 你不应该看到这个错误。

标签: sql sql-server types casting type-conversion


【解决方案1】:

这显然导致了您的错误:

SUM(AUM.ManagementFee * AUM.AUM) AS Management_Fee

因为AUM.AUM 是一个字符串。如果你想存储一个数字,这似乎是一个非常糟糕的数据类型选择。但是,我怀疑你真的只是想要一个直接的总和:

SELECT c.ClientName, 
       SUM(a.ManagementFee) AS Management_Fee
FROM Clients c JOIN
     AUM a
     ON a.AUMid = c.AUMid
GROUP BY c.ClientName;

另一方面,问题可能在于AUM 是一个逗号分隔的数字列表。如果是这样,我的第一个也是最真诚的建议是修复数据模型。如果由于某种原因你不能这样做,你可以解析字符串并保持手指交叉,它可以工作:

SELECT c.ClientName, 
       SUM(a.ManagementFee * TRY_CONVERT(NUMERIC(38, 6), s.value)) AS Management_Fee
FROM Clients c JOIN
     AUM a
     ON a.AUMid = c.AUMid CROSS APPLY
     string_split(a.aum, ',') s
GROUP BY c.ClientName;

【讨论】:

  • 感谢您再次拯救我的皮,戈登!事实上,我确实想将 ManagementFee 乘以 AUM(管理下的资产)。尽管您关于 AUM 是逗号分隔的数字列表的指导解决了这个问题。
  • 我看到我的问题收到了一些反对票。你对我提出更好的问题有什么建议吗?我确实尝试通过事先研究和试错来解决它,但无济于事。是否缺乏必要的信息来帮助解决问题?或者是其他东西?任何建设性的反馈将不胜感激。
  • @JMBurnworth 。 . .我不知道为什么人们会这么快就投反对票,尤其是在没有给予指导的情况下。也就是说,您的问题将通过样本数据和问题中的预期结果得到改善。实际问题需要从原始问题和cmets中辨别出来。这个问题应该独立存在。 (您可以编辑问题)。
  • @JMBurnworth,Gordon 已经解释过,但请参阅 link 1 & link 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 2015-12-24
  • 2020-06-02
  • 2012-09-25
相关资源
最近更新 更多