2012-11-16 7 views
5

Tôi đang làm việc trên SQLServer 2008 với bảng sau:làm tròn số thập phân trong liên hiệp các khoản tiền?

id  user  program seconds 
------------------------------------ 
9999 'user01' 'pr01'  5 

Cột 'giây' được định nghĩa là một số thập phân (14,0) và hàng chỉ trong bảng là một hiển thị.

Vì vậy, tôi thử một số truy vấn:

Q1:

select seconds*0.95 from myTable 
union all 
select seconds from myTable 

Nó cho kết quả tôi mong đợi:

4.75 
5.00 

Q2:

select sum(seconds)*0.95 from myTable 
union all 
select sum(seconds) from myTable 

Tôi đã chờ đợi sự kết quả tương tự như trong Q1 nhưng resu lt tôi nhận được là:

5 
5 

Q3:

select sum(seconds)*0.95 from myTable 
union all 
select sum(seconds)*1.00 from myTable 

Trong trường hợp này tôi nhận được kết quả tôi mong đợi:

4.75 
5.00 

Vì vậy, tôi muốn biết tại sao Q2 không phải là nhận được kết quả mong đợi. Tôi đã thử ví dụ tương tự với 'giây' là số thập phân (2.0) và hoạt động tốt vì vậy tôi đoán nó có liên quan đến kích thước thập phân, nhưng trong trường hợp đó tôi không thể hiểu tại sao Q1 và Q3 hoạt động trong khi Q2 thì không.

+0

Tôi đang thử lại với số thập phân (2.0) và dường như không hoạt động hoặc –

Trả lời

4

Kết quả của sum(seconds)numeric(38,0) có ý nghĩa khi bạn có thể tổng hợp bất kỳ số nào của numeric(14,0) hàng và điều này tránh làm tràn loại nhỏ hơn.

Nhân một numeric(38,0) bởi 0.95 (numeric(2,2)) ở phần đầu đưa ra một kết quả của numeric(38,2) theo explanation here.

Nhưng phần dưới cùng của unionnumeric(38,0) nên kết quả như một toàn thể được đúc để numeric(38,0) mà lại có ý nghĩa như numeric(38,2) luôn có thể đúc để numeric(38,0) mà không có lỗi (dù với một sự mất mát của chữ số sau chữ số thập phân) nhưng đúc các cách khác sẽ không làm việc ở tất cả cho số lượng rất lớn.

Bạn có thể bỏ phần đáy một cách rõ ràng để numeric(38,2) để tránh điều này.

SELECT sum(seconds) * 0.95 AS S 
FROM myTable 
UNION ALL 
SELECT CAST(sum(seconds) AS NUMERIC(38, 2)) 
FROM myTable 
+0

Cảm ơn bạn rất nhiều. Giờ thì tôi đã hiểu :) –