USE AdventureWorks2014
SELECT
result.BusinessEntityID,
p.FirstName, p.LastName,
result.TotalSales, '2011' AS SalesYear,
CASE
WHEN CAST(result.TotalSales AS int) > 1000000 THEN 'MillionPlus'
WHEN CAST(result.TotalSales AS int) < 100000 THEN 'Warning'
ELSE 'Met Expectations'
END AS BonusCategory
FROM
person.Person AS P,
(SELECT sp.BusinessEntityID, FORMAT(sum(soh.SubTotal), 'c', 'en-us') AS TotalSales
FROM sales.SalesPerson as sp
RIGHT JOIN sales.SalesOrderHeader as SOH ON sp.BusinessEntityID = soh.SalesPersonID
WHERE soh.orderdate LIKE '%2011%'
GROUP BY sp.BusinessEntityID) AS result
WHERE
result.BusinessEntityID = p.BusinessEntityID
OR result.TotalSales IS NULL
ORDER BY
result.BusinessEntityID
전체 오류 메시지
nvarchar 값 '$ 28,926.25'를 데이터 형식 int로 변환 할 때 Msg 245, 수준 16, 상태 1, 줄 2 변환에 실패했습니다.
거의 모든 플랫폼에서 프로그래밍 할 때와 같은 숫자 값 123.45
과 문자열 또는 텍스트 값 사이에서 변환 할 때 이해해야 할 "123.45"
것은 놀랍도록 느리고 비용이 많이 드는 작업입니다. 똑같아 보이지만 가치 가 다르며 국제화 / 문화적 문제로 인해 이들 간의 전환은 사소하지 않습니다. 항상 이러한 전환을 최소화하도록 노력하고 필요한 경우 가능한 마지막 순간까지 그대로 두십시오.
SQL Server도 예외는 아닙니다. 숫자와 텍스트를 혼합하는 것은 매우 까다로울 수 있습니다.
이 질문의 경우 중첩 된 내부 쿼리는 숫자 인 sum(soh.SubTotal)
표현식을 가져 와서 텍스트 필드 를 생성하는 함수 호출로 래핑 합니다. 나중에 결과를 다시 숫자 인 것처럼 외부 쿼리에 사용하려고 합니다.FORMAT()
하지마!
SELECT
가능한 마지막 순간에 외부 문의 절 까지 결과 형식을 지정합니다 . 이를 통해 표현식 CAST()
내부에서 s를 CASE
완전히 제거 할 수 있습니다 .
또한 이전 조인 구문을 사용하지 마십시오A,B WHERE
. 지금은 25 년 넘게 구식입니다.
USE AdventureWorks2014
SELECT result.BusinessEntityID, p.FirstName, p.LastName,
FORMAT(result.TotalSales,'c','en-us') As TotalSales, '2011' as SalesYear,
CASE
WHEN result.TotalSales > 1000000 THEN 'MillionPlus'
WHEN result.TotalSales < 100000 THEN 'Warning'
ELSE 'Met Expectations'
END as BonusCategory
FROM person.Person as P
INNER JOIN (
SELECT sp.BusinessEntityID, FORMAT(sum(soh.SubTotal),'c','en-us') as TotalSales
FROM sales.SalesPerson as sp
RIGHT JOIN sales.SalesOrderHeader as SOH
ON sp.BusinessEntityID = soh.SalesPersonID
WHERE soh.orderdate LIKE '%2011%'
GROUP BY sp.BusinessEntityID
) result ON (result.BusinessEntityID = p.BusinessEntityID OR result.TotalSales is null)
ORDER BY result.BusinessEntityID
더 좋은 점 은 SELECT 절에서 문자열 / 텍스트로 변환하지 않는 것입니다! 클라이언트 프로그램이나보고 도구가이 부분을 처리하도록하십시오. 이것은 우리가 첫 단락의 "가능한 마지막 순간으로 전환을 남겨 두십시오"지침을 따를 수있는 또 다른 방법입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다