2013-03-08 59 views
10

Tôi đang tìm cách chuyển đổi một cột thành chuỗi trong đó cột là một chỉ số được chọn và sau đó concat với cột khác. Đây là nơi sự nhầm lẫn của tôi xảy ra khi sử dụng CONVERT hoặc CAST.Chuyển đổi cột thành chuỗi trong SQL Chọn

Ví dụ:

SELECT employeeID 
    ,name 
    ,location 
    ,(SELECT COUNT(DISTINCT loginsFailed) 
    FROM users 
    WHERE (users.employeedID = userDetails.employeeID) 
     AND (users.startdate = 01-01-2013) as LoginCountFailed 
    ,(SELECT COUNT(DISTINCT logins) 
    FROM users 
    WHERE (users.employeedID = userDetails.employeeID) 
     AND (users.startdate = 01-01-2013) as LoginCount 
FROM userDetails 

Bây giờ, truy vấn này hoạt động hoàn hảo trong đó là cung cấp chính xác số lần đăng nhập và thất bại như số nguyên. Tuy nhiên, tôi muốn sử dụng các số nguyên như một chuỗi để tôi có thể một cột. Có một lý do tại sao điều này cần phải là một cột như chuỗi.

Tôi muốn chỉ có 4 cột, không phải 5. Cột đăng nhập tôi muốn có là loginCountFailed/LoginCount. Ví dụ: 3/12. Tôi cần nó như là một chuỗi bởi vì bạn không thể chia cho 0 và có những thời điểm mà mẫu số là 0.

+1

đầu ra cuối cùng bạn muốn là gì? Một chuỗi như ''3/12''? Hoặc kết quả thực sự của bộ phận đó, tức là '4'? Bạn chỉ muốn một chuỗi để tránh một sai số bằng không? –

Trả lời

10

Đối concatanating số trong MSSQL-2005 bạn nên sử dụng CAST

CAST(loginsFailed AS VARCHAR(10)) + '/' + CAST(LoginCount AS VARCHAR(10)) 

loginsFailed và loginCount trên là thực sự select count distinct mảnh vỡ của bạn

Tôi hy vọng rằng công trình này

CAST ((SELECT COUNT(DISTINCT loginsFailed) FROM users WHERE users.employeedID = userDetails.employeeID AND users.startdate = 01-01-2013) AS VARCHAR(10)) 
+ '/' + 
CAST ((SELECT COUNT(DISTINCT logins) FROM users WHERE users.employeedID = userDetails.employeeID AND users.startdate = 01-01-2013) AS VARCHAR(10)) 
+0

Vâng, tôi biết sử dụng dàn diễn viên. Tuy nhiên, tôi không thể nhận được cú pháp chính xác khi sử dụng các lựa chọn phụ. – user1188241

+0

Tôi đã thêm một mẫu –

+1

Tác phẩm này. Tôi có thể thấy nơi tôi đã phạm sai lầm.Tôi đã đúc sai số phụ chọn sai với bí danh đang ở trong đó. Đây là phần khó hiểu đối với tôi. – user1188241

2
DECLARE @i int 
SET @i=98235 

--Method 1 : Use CAST function 
SELECT CAST(@i as varchar(10)) 

--Method 2 : Use CONVERT function 
SELECT CONVERT(varchar(10),@i) 

--Method 3 : Use STR function 
SELECT LTRIM(STR(@i,10)) 

Source

+0

Tôi rất hài lòng với CONVERT và CAST khi chọn một cột, tuy nhiên tôi không biết cách CONVERT hoặc CAST câu lệnh Select sub và sau đó concat cả hai. – user1188241

1

Bạn có thể làm như sau bằng cách sử dụng CAST hoặc CONVERT:

CONVERT(VARCHAR(20), YourIntColumn) 

HOẶC

CAST(YourIntColumn AS VARCHAR(20)) 
2

Những gì bạn muốn làm là có một tuyên bố trường hợp để xử lý chia cho số không logic, không chuyển sang một chuỗi cho dữ liệu số.

SELECT employeeID 
    ,name 
    ,location 
    ,(SELECT CASE WHEN COUNT(DISTINCT logins) = 0 then 0 ELSE 
COUNT(DISTINCT loginsFailed)/COUNT(DISTINCT logins) 
END 
    FROM users 
    WHERE (users.employeedID = userDetails.employeeID) 
     AND (users.startdate = 01-01-2013)) as LoginFailRatio 
FROM userDetails 
+0

Điều này có vẻ như nó sẽ hoạt động nếu đăng nhập và đăng nhập vào nơi các cột cơ sở dữ liệu. Làm thế nào sẽ làm việc này bằng cách sử dụng ví dụ của tôi đã được những bí danh tên cột được xây dựng từ lựa chọn phụ? – user1188241

+0

Các giá trị này vẫn được tạo bằng cách sử dụng subselect. Nó chỉ kết hợp COUNTs() vào một subselect duy nhất và sau đó không phân chia có điều kiện về việc có một số thông tin đăng nhập. Bạn đã chạy nó? –

0

Tôi nghĩ bạn chỉ có thể tạo truy vấn bên ngoài tại đây:

SELECT u.employeeID, u.name, u.location, 
     CONVERT(varchar(10), u.LoginCountFailed) + '/' + CONVERT(varchar(10), u.LoginCount) "Ratio" 
    FROM 
     (
     SELECT employeeID 
      ,name 
      ,location 
      ,(SELECT COUNT(DISTINCT loginsFailed) 
      FROM users 
      WHERE (users.employeedID = userDetails.employeeID) 
       AND (users.startdate = 01-01-2013) as LoginCountFailed 
      ,(SELECT COUNT(DISTINCT logins) 
      FROM users 
      WHERE (users.employeedID = userDetails.employeeID) 
       AND (users.startdate = 01-01-2013) as LoginCount 
     FROM userDetails 
     ) u 
+0

Điều này không hoạt động – user1188241

+0

@ user1188241 - Xin lỗi về điều đó. Bạn có thể thử ngay bây giờ (tôi đã thay đổi nó một chút) và đăng lỗi chính xác (nếu nó vẫn còn có vấn đề)? –

0

Tôi nghĩ rằng điều này sẽ làm các trick

Select column1 + '/' + column2 from table1 
Các vấn đề liên quan