Làm cách nào để có kết quả nổi bằng cách chia hai giá trị nguyên bằng T-SQL?


172

Sử dụng T-SQL và Microsoft SQL Server Tôi muốn chỉ định số chữ số thập phân khi tôi thực hiện phép chia giữa 2 số nguyên như:

select 1/3

Điều đó hiện đang trở lại 0. Tôi muốn nó trở lại 0,33.

Cái gì đó như:

select round(1/3, -2)

Nhưng điều đó không hiệu quả. Làm thế nào tôi có thể đạt được kết quả mong muốn?


3
Bạn đã thử 1.0 / 3 chưa?
Thilo

Những câu trả lời tôi nhận được là quá đủ
LaBracca

Câu trả lời:


276

Các đề xuất từ ​​stb và xiowl đều ổn nếu bạn đang tìm kiếm một hằng số. Nếu bạn cần sử dụng các trường hoặc tham số hiện có là số nguyên, trước tiên bạn có thể đặt chúng thành số float:

SELECT CAST(1 AS float) / CAST(3 AS float)

hoặc là

SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)

Hoặc bạn có thể sử dụng chúng dưới dạng số thập phân, nếu bạn muốn có kết quả thập phân.
Tim

30
CHỌN 1.0 * MyInt1 / MyInt2
Troglo 11/2/2015

@TroubleZero cho sử dụng MySQLdecimal
itazzad

cảm ơn rất nhiều, bạn đã cứu ngày của tôi Tôi đã thử CAST (7/3 AS float) nhưng trở lại 2 lần nữa. Vì vậy, số lượng diễn viên được giải quyết vấn đề của tôi.
Yasin Yörük

3
không cần phải chia cả cổ tức và ước số, hãy xem câu trả lời của @MS ' stackoverflow.com/a/30639343/2866644
robotik

69

Bởi vì SQL Server thực hiện phân chia số nguyên. Thử cái này:

select 1 * 1.0 / 3

Điều này rất hữu ích khi bạn vượt qua số nguyên dưới dạng params.

select x * 1.0 / y

1
Bạn thậm chí có thể bỏ qua các số không.
John


27

sử dụng

select 1/3.0

Điều này sẽ làm công việc.


13

Tôi hiểu rằng CASTing to FLOATkhông được phép trong MySQL và sẽ phát sinh lỗi khi bạn cố gắng CAST(1 AS float)như đã nêu tại MySQL dev .

Cách giải quyết cho việc này là một cách đơn giản. Cứ làm đi

(1 + 0.0)

Sau đó sử dụng ROUNDđể đạt được một số vị trí thập phân cụ thể như

ROUND((1+0.0)/(2+0.0), 3)

SQL ở trên chia 1 cho 2 và trả về một dấu phẩy cho 3 vị trí thập phân, như trong nó sẽ là 0.500.

Người ta có thể CASTcác loại sau: nhị phân, char, ngày, datetime, thập phân, json, nchar, đã ký, thời giankhông dấu .


3
MySQL không cho phép CAST, nó chỉ không cho phép truyền tới FLOAT. Diễn viên DECIMALthay thế. Xem ví dụ stackoverflow.com/questions/7368163/... .
markusk

7

Có vẻ như thủ thuật này hoạt động trong SQL Server và ngắn hơn (dựa trên các câu trả lời trước)

SELECT 1.0*MyInt1/MyInt2

Hoặc là:

SELECT (1.0*MyInt1)/MyInt2

2
Tôi thích điều này nhất, nó thậm chí trông rất đẹp khi tính toán tỷ lệ phần trăm:SELECT 100.0 * @Elapsed / @Total
EliSherer

3

Dùng cái này

select cast((1*1.00)/3 AS DECIMAL(16,2)) as Result

Ở đây trong sql này trước tiên chuyển đổi thành float hoặc nhân với 1,00. Sản lượng sẽ là số float. Tôi xem xét 2 chữ số thập phân. Bạn có thể chọn những gì bạn cần.


2

Nếu bạn đến đây (giống như tôi) để tìm giải pháp cho giá trị nguyên , đây là câu trả lời:

CAST(9/2 AS UNSIGNED)

trả về 5

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.