2014-09-29 57 views
9

Tôi có một chuỗi truy vấn trả về một giá trị có nhiều chữ số thập phân. Tôi muốn định dạng thành tiền tệ $ 123.45.SQL Server 2008: cách định dạng đầu ra dưới dạng đơn vị tiền tệ

Đây là truy vấn:

SELECT COALESCE(SUM(SUBTOTAL),0) 
FROM dbo.SALESORD_HDR 
where ORDERDATE = datediff(d,0,getdate()) 
and STATUS NOT IN (3,6) 

Tôi muốn kết quả trong một đồng tiền với 2 chữ số thập phân.

+0

Bạn có nghĩa là loại tiền tệ "thực", một loại tiền tệ có thể xử lý định dạng cho các nền văn hóa khác nhau không? Tương tự như hàm FORMAT đã bắt đầu trong SQL Server 2012 (http://msdn.microsoft.com/en-us/library/hh213505.aspx)? –

+0

Không, chỉ một nền văn hóa (en-us) cho Đô la New Zealand $ #, ###. 00 – Bevan

+1

Ok. Tôi vẫn thêm câu trả lời có tính đến định dạng đầy đủ (tức là ký hiệu tiền tệ, vị trí của ký hiệu, dấu phân cách hàng nghìn và dấu thập phân). Nhưng để được rõ ràng, bạn _do_ muốn tách hàng ngàn (như trong ví dụ trong bình luận của bạn), phải không? –

Trả lời

12

Nếu bạn đang tìm định dạng tiền tệ "thực", tương tự như những gì có thể đạt được thông qua hàm FORMAT đã bắt đầu trong SQL Server 2012, thì bạn có thể đạt được cùng chức năng chính xác qua SQLCLR. Bạn có thể tự viết mã đơn giản .ToString("C" [, optional culture info]) hoặc bạn có thể tải xuống thư viện SQL# (mà tôi đã viết, nhưng chức năng này có trong phiên bản miễn phí) và sử dụng nó giống như hàm T-SQL FORMAT.

Ví dụ:

SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'en-us'); 

Output:

$ 123,46

SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'fr-fr'); 

Output:

123,46 €

Phương pháp này hoạt động trong SQL Server 2005/2008/2008 R2. Và, nếu/khi bạn nâng cấp lên phiên bản mới hơn của SQL Server, bạn có tùy chọn dễ dàng chuyển sang hàm T-SQL gốc bằng cách không thay đổi tên SQL#.Math_FormatDecimal thành chỉ FORMAT.

Đưa này vào bối cảnh của truy vấn từ câu hỏi ban đầu:

SELECT SQL#.Math_FormatDecimal(COALESCE(SUM(SUBTOTAL),0), N'C', N'en-us') AS [Total] 
FROM dbo.SALESORD_HDR 
where ORDERDATE = datediff(d,0,getdate()) 
and STATUS NOT IN (3,6) 

EDIT:

OR, vì nó có vẻ rằng chỉ en-us định dạng là mong muốn, có một short-cut quá dễ dàng: Chuyển đổi từ các kiểu dữ liệu MONEY hoặc SMALLMONEY bằng cách sử dụng hàm CONVERT có một "kiểu" cho en-us trừ biểu tượng tiền tệ, nhưng điều đó đủ dễ dàng để thêm:

SELECT '$' + CONVERT(VARCHAR(50), 
       CONVERT(MONEY, COALESCE(SUM(SUBTOTAL), 0)), 
       1) AS [Total] 
FROM dbo.SALESORD_HDR 
where ORDERDATE = datediff(d,0,getdate()) 
and STATUS NOT IN (3,6) 

Kể từ nguồn datatype của trường SUBTOTALFLOAT, nó đầu tiên cần phải được chuyển đổi sang MONEY và sau đó chuyển đổi sang VARCHAR. Nhưng, "phong cách" tùy chọn là một trong những lý do tôi thích CONVERT hơn CAST.

+0

OK, vậy làm cách nào để viết nó cho vừa với mã tôi có? nếu tôi đặt truy vấn của tôi ở nơi giá trị cố định của bạn 123.456 là, nó không thành công và nói không thể làm tổ một truy vấn bên trong. – Bevan

+0

@ Bevan: nó chỉ là một hàm như COALESCE, SUM, v.v. Tôi sẽ cập nhật câu trả lời của tôi để sử dụng nó trong ngữ cảnh truy vấn của bạn. –

+1

@Bevan: câu trả lời đã được cập nhật với mức sử dụng thực tế. –

Các vấn đề liên quan