Объединить столбец NVARCHAR с результатом суммы в SQL Server - PullRequest
0 голосов
/ 02 октября 2019

Как объединить столбец NVARCHAR с результатом SUM в SQL Server?

Я пытался

dbo.tblCurrencies.strCurrencySymbol + dbo.tblItems.dcUnitPrice * dbo.tblItems.intItemQuantity

Что говорит мне:

Ошибка преобразования типа данных nvarchar в числовой

Итак, я попытался

dbo.tblCurrencies.strCurrencySymbol + CAST(SUM(dbo.tblItems.dcUnitPrice * dbo.tblItems.intItemQuantity) AS NVARCHAR)

AND

CAST(dbo.tblCurrencies.strCurrencySymbol + SUM(dbo.tblItems.dcUnitPrice * dbo.tblSalesOrderItems.intItemQuantity) AS NVARCHAR)

Обе подскажите

Невозможно использовать агрегат или подзапрос в выражении, используемом для группы по списку, по группам по предложению.

Если вам нужна дополнительная информация, просто дайте мне знать, я ее напишуup.

РЕДАКТИРОВАТЬ:

Запрос

SELECT        dbo.tblItems.fkOrder, dbo.tblCurrencies.strCurrencySymbol + SUM(dbo.tblItems.dcUnitPrice * dbo.tblItems.intItemQuantity) AS TotalPrice
FROM          dbo.tblCurrencies RIGHT OUTER JOIN
              dbo.tblOrders ON dbo.tblCurrencies.pkCurrency = dbo.tblOrders.fkPaysInCurrency RIGHT OUTER JOIN
              dbo.tblItems ON dbo.tblOrders.pkOrder = dbo.tblItems.fkOrder
GROUP BY      dbo.tblItems.fkOrder

РЕДАКТИРОВАТЬ 2:

Хорошо Мне удалось решить его, добавив dbo.tblCurrencies.strCurrencySymbol в группус помощью CONCAT()

Мой запрос теперь выглядит следующим образом:

SELECT        dbo.tblItems.fkOrder, { fn CONCAT(dbo.tblCurrencies.strCurrencySymbol, CAST(SUM(dbo.tblItems.dcUnitPrice * dbo.tblItems.intItemQuantity) AS NVARCHAR(10))) } AS TotalPrice
FROM          dbo.tblCurrencies RIGHT OUTER JOIN
              dbo.tblOrders ON dbo.tblCurrencies.pkCurrency = dbo.tblOrders.fkPaysInCurrency RIGHT OUTER JOIN
              dbo.tblItems ON dbo.tblOrders.pkOrder = dbo.tblItems.fkOrder
GROUP BY      dbo.tblItems.fkOrder, dbo.tblCurrencies.strCurrencySymbol

Он также работает без CONCAT()

SELECT        dbo.tblItems.fkOrder, dbo.tblCurrencies.strCurrencySymbol + CAST(SUM(dbo.tblItems.dcUnitPrice * dbo.tblItems.intItemQuantity) AS NVARCHAR(10)) AS TotalPrice
FROM          dbo.tblCurrencies RIGHT OUTER JOIN
              dbo.tblOrders ON dbo.tblCurrencies.pkCurrency = dbo.tblOrders.fkPaysInCurrency RIGHT OUTER JOIN
              dbo.tblItems ON dbo.tblOrders.pkOrder = dbo.tblItems.fkOrder
GROUP BY      dbo.tblItems.fkOrder, dbo.tblCurrencies.strCurrencySymbol

Не уверен, что лучшехотя

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

В SQL Server существует концепция с именем Тип данных Приоритет . Это происходит в таких случаях, когда необходимо объединить два разных типа данных, потому что должен быть метод, чтобы решить, какой тип данных будет в конечном результате.

В вашем случае вы комбинируетеТипы данных NVARCHAR и NUMERIC и поскольку NUMERIC имеет более высокий приоритет, подход, который он использует, состоит в том, чтобы попытаться преобразовать ваши текстовые данные в число, которое он не может сделать, поэтому возникает ошибка.

Если вам нужно преобразование вработать не так, как определено в обычном порядке приоритета, тогда вам нужно явно выполнить преобразование самостоятельно с помощью CAST или CONVERT. В вашем случае вам нужно умножить необходимые числа, преобразовать их в текст, а затем объединить символ валюты.

Последующие ошибки возникают из-за использования полей, которые не находятся ни в агрегате, ни указаны в Group By вашего оператора select. Добавление поля вашей валюты должно решить другую проблему, если вы не можете иметь один ордер с несколькими задействованными валютами.

Собрав все это вместе, вы получите следующее:

SELECT
     Orders.fkOrder,
     Currencies.strCurrencySymbol
      + CAST(SUM(Items.dcUnitPrice * Items.intItemQuantity) AS varchar(50)) AS TotalPrice
FROM dbo.tblItems AS Items
LEFT OUTER JOIN dbo.tblOrders AS Orders
    ON Items.fkOrder = Orders.pkOrder
LEFT OUTER JOIN dbo.tblCurrencies AS Currencies
    ON Orders.fkPaysInCurrency = Currencies.pkCurrency
GROUP BY Orders.fkOrder, Currencies.strCurrencySymbol
0 голосов
/ 02 октября 2019

Основываясь на фрагменте запроса, который вы разместили, я бы попробовал что-то вроде

dbo.tblCurrencies.strCurrencySymbol + 
    CAST(SUM(dbo.tblItems.dcUnitPrice * dbo.tblSalesOrderItems.intItemQuantity) AS NVARCHAR(x))

Обратите внимание: приведение к NVARCHAR выполняется только для части суммы

x - это длина строки NVARCHAR, к которой вы хотите привести ее (убедитесь, что она достаточно широка, чтобы вместить наибольшее значение, которое может вернуть сумма).

Использованиеимя схемы до имени столбца устарело.

...