Sql 将数据类型nvarchar转换为数字转换/转换时出错

Sql 将数据类型nvarchar转换为数字转换/转换时出错,sql,sql-server,types,casting,type-conversion,Sql,Sql Server,Types,Casting,Type Conversion,我怀疑这与报告ClientName有关,这是一种nvarchar数据类型AUMid是nchar。我不知道如何在不改变数据类型的情况下解决这个问题(我不喜欢这样) 我需要显示Clients.ClientName。它通过AUM.AUMid链接到AUM表 CREATE TABLE Clients ( ClientID nvarchar(50), ClientName nvarchar(50) AccountID nchar(10), AUMid nchar(10) )

我怀疑这与报告
ClientName
有关,这是一种
nvarchar
数据类型
AUMid
nchar
。我不知道如何在不改变数据类型的情况下解决这个问题(我不喜欢这样)

我需要显示
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)作为管理费删除可以执行查询。

这显然是导致错误的原因:

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;

请包括一些示例数据。AUMid=1 AUM=18431221.11 ManagementFee=0.0125 ClientName=Allegany Fire Department是否有定义为文本但包含数字数据的列?我不这样认为。您不应该看到此错误。感谢您再次保存我的隐藏,Gordon!事实上,我确实想用管理费乘以资产管理规模(AUM)。虽然你关于奥姆是一个逗号的指导解决了这个问题。我看到我的问题得到了一些反对票。你有什么建议让我发布更好的问题吗?我确实试图通过研究和尝试/错误预先解决它,但没有成功。是因为缺乏必要的信息来帮助解决问题吗?还是别的什么?任何建设性的反馈都将不胜感激。@JMBurnworth。我不知道为什么人们这么快就投了反对票,尤其是在没有给予指导的情况下。也就是说,您的问题将通过样本数据和问题中期望的结果得到改进。实际问题需要与原始问题和评论区分开来。这个问题应该独立存在。(你可以编辑这个问题)。@JMBurnworth,Gordon已经解释过了,但是请看&
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;