Hàm Roundup giống Excel trong PostgreSQL? | PostgreSQL Roundup function like Excel?

Trong bài trước tôi có giới thiệu Làm thể nào thể tính RoundUp giống Excel trong JavaScript? (How to RoundUp like excel in Javascript?), đây cũng là cùng vấn đề tôi gặp phải khi thực hiện yêu cầu của khách hàng, chỉ khác là lúc này tôi cần phải xử lý vấn đề roundup() trong SQL trên cơ sở dữ liệu PostgreSQL.

Yêu cầu nhỏ từ khách hàng là tính toán các thông số về tiền nợ trong file excel và giờ muốn chuyển sang làm trên website, tuy nhiên trong công thức tính toán của khánh hàng có sử dụng một hàm là ROUNDUP (roundup function) làm tròn số tới hàng triệu, vấn đề xảy ra là bên PostgreSQL thì lại không có hàm này. Để giải quyết vấn đề này tôi đã mất khoảng vài giờ để phân tích và tìm kiếm giải pháp, và tôi muốn chia sẻ điều này với các bạn.

Đầu tiên trong luồn suy nghĩ của tôi nếu làm tròn lên số thập phần ví như 0.1 → 1 thì khá đơn giản, nhưng vấn đề ở đây là ta cần một hàm ROUNDUP giống với Excel để phù hợp với các yêu cầu tính toán của khách hàng ví dụ trong file excel có sử dụng hàm làm tròn lên như sau roundup("number",-6) nghĩa là làm tròn tới hàng triệu của số tiền ví dụ 11,100,100 sẽ được làm tròn là 12,000,000 hoặc ví như số thập phân 11,000,000.001 thì nó cũng sẽ cho kết quả là 12.000.000 quả là một sự thú vị đau đầu :)) (có thể bạn sẽ thắc mắc tại sao tôi dùng dấu . để phân chia số thập phân mà không dùng dấu , đơn giản là vì tôi đang viết theo chuẩn quốc tế)

Vì vậy hướng suy nghĩ tiếp theo của tôi là phải làm sao có đường hàm ROUNDUP trong PostgreSQL, và để làm được điều này ta cần phải có được công thức của hàm roundup trong excel (formula calculate roundup funcion in excel), sau vài giờ tìm kiếm đúc kết công thử nghiệm tôi đã có được kết quả như sau:

select ceil([number]*power(10, -6))/power(10, -6)

Tính ra công thức cũng không tới nổi phức tạp chủ yếu là do chung ta không biết mờ thôi :)) nên tôi cũng không giải thích chi tiết hàm (function) trên, các bạn tự ngẫm xíu là hiểu liền, đây cũng là một cách học đây :)) Bây giờ chúng ta hãy thử nghiệm một chút rồi lấy kết quả so sánh lại với công thức trong excel xem như thế nào, tôi tiến hành thử nghiệm như sau.

    select ceil(11800000*power(10, -6))/power(10, -6)
    select ceil(11400000*power(10, -6))/power(10, -6)
    select ceil(100*power(10, -6))/power(10, -6)
    select ceil(11010000*power(10, -6))/power(10, -6)
    select ceil(11000000*power(10, -6))/power(10, -6)
    select ceil(11000000.123*power(10, -6))/power(10, -6)

Tương ứng kết quả tôi nhận được sẽ là:

    12000000
    12000000
    1000000
    12000000
    11000000
    12000000

Sau khi so sánh lại với hàm roundup() trong excel tôi cũng nhận được cùng kết quả. Nếu bạn có câu hỏi hay chỗ nào chưa rõ hoặc tester ra chỗ sai nào thì đừng ngần ngại hãy thảo luận cùng tôi tại đây.


No comments:

Post a Comment