2012-09-27 2 views
2

인벤토리 데이터베이스에 2 개의 값이 있습니다. 하나는 QtyOnHand (float)이고 다른 하나는 해당 항목에 대한 모든 재고 트랜잭션을 계산하는 것입니다 (transQty도 float 인 SUM(TransQty)으로 생각하십시오). 문제는 알 수없는 이유로 시간이 지남에 따라 이러한 값 중 일부가 동기화되지 않습니다. 그래서 지금 나는 그들을 청소하려고하고있다.SQL long float numbers로 작업하는 데 문제가 있습니다.

기본적으로 QtyOnHand (정확한 것으로 선언 함)를 가져 와서 거래 합계를 뺍니다. 그런 다음 차이에 대한 트랜잭션을 수정 입력하십시오. 이것은 "십진법 먼지"가 많은 숫자를 얻을 때까지 훌륭합니다. 또한 실제 값이 0.0000000000000000237 인 경우에도 float은 0으로 표시됩니다.

여기는 문제를 해결하는 데 도움이되는 데이터가 있습니다. 과학적 표기법

Example Data

항목은 나에게 문제를주고있다. 내 쿼리가 1 % 불일치 밖에있는 값을 반환하기 때문에 -18, -18을 나타내는 PLXL-105-H 항목을 나타내는 행까지도 정확하게 표시되지 않습니다. TSQL에서 전적으로 작업 해 왔지만 C# 프로그램의 값을 조작하는 데 도움이됩니까?

여기 내 질문이 있습니다.이 숫자는 어떻게 처리해야합니까? 나는 그들을 십진수 (38,38)로 변환하려고 시도했지만 산술 오버플로가 발생합니다. 그 차이를 나타내는 정확한 값을 구해야하고 그 값을 사용하여 균형을 맞추어야합니다.

+0

실생활에서 그 정확도는 무엇을 의미합니까? – Randy

+0

@ Randy-Nothing, 우리가 작업하는 가장 작은 단위는 .1 (1/10)입니다. – MAW74656

+0

현재 값의 abs가 1보다 작 으면 transbal을 0으로 업데이트 할 수 있습니까? – Randy

답변

1

어떻게 입력 하시겠습니까?

with to_update as (
    select itemNumber, QtyOnHand, TransBal 
    from t 
) 
update tb_table 
    set offset = TransBal - QtyOnHand 
    from to_update 
    where to_udpate.itemNumber = tb_table.itemNumber 

트릭을 수행해야합니다 같은 일을

.

데이터베이스에서 데이터를 가져 와서 조작 한 다음 다시 넣으려고하는 것 같습니다. 데이터베이스 내에 있으면 값이 변환되지 않으므로 문제가 없습니다. 문자열에.

그런데 십진수 변환에서는 decimal(38,19) 또는 뭔가를 사용해야합니다. scale 매개 변수는 소수점 오른쪽의 자릿수에 대한 것이므로 38로 설정하면 -1과 1 사이의 숫자 만 나타냅니다.

+1

질문은 sql-server-2000으로 태그가 지정되어 있으므로 여기서는 CTE가 작동하지 않습니다. 그래도 DECIMAL에 좋은 점. – Lamak

+0

글쎄, 난 확실히 Decimal 잘못 사용했다. 그러나 데이터베이스에서 데이터를 가져 와서 다시 넣으려고하는 것이 아니라 단지 부작용이었습니다 (더 좋을까요?). OP에서 말했듯이 전 SQL Server 2000 TSQL에서 일하고 있습니다. – MAW74656

+0

@ Lamak- 사실이지만 정보를 저장하는 데 변수를 사용하는 것과 비슷한 논리를 사용하고 있습니다. – MAW74656