Ошибка преобразования типа данных nvarchar в numeri c convert / cast - PullRequest
0 голосов
/ 02 августа 2020

Я подозреваю, что это связано с отчетом ClientName, который является типом данных nvarchar. AUMid равно nchar. Я не знаю, как обойти это без изменения типов данных (чего я предпочитаю не делать).

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 через AUM.AUMid.

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 позволяет выполнить запрос.

1 Ответ

0 голосов
/ 02 августа 2020

Это явно вызывает вашу ошибку:

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;
...