2013-03-08 25 views
10

我期待將列轉換爲字符串,其中列是選擇語句,然後與另一列進行連接。這是我使用CONVERT或CAST時發生混亂的地方。將列轉換爲SQL中的字符串選擇

例子:

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 

現在,這個查詢的工作完美的是提供登錄的正確數量和失敗爲整數。但是,我想使用這些整數作爲一個字符串,所以我可以一列。這是爲什麼這需要作爲一個字符串的列。

我想只有4列,而不是5.我想要的登錄列是loginCountFailed/LoginCount。例如:3/12。我需要的是一個字符串,因爲你不能用0分,並有多次分母爲0

+1

什麼是你想要的最終輸出?像「3/12」這樣的字符串?或者該部門的實際結果,即「4」?你只想要一個字符串來避免零錯誤的分裂? – 2013-03-08 16:57:42

回答

10

對於MSSQL 2005 concatanating號碼,你應該使用CAST

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

loginsFailed和loginCount上面實際上是你select count distinct片段

我希望這個作品

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

是的,我知道使用演員。但是,使用子選擇時,我無法獲得正確的語法。 – user1188241 2013-03-08 17:24:49

+0

我已經添加了一個示例 – 2013-03-08 17:41:25

+1

這可以工作。我可以看到我犯了什麼錯誤。我正在使用別名存在的錯誤來轉換子選擇語句。這是我感到困惑的部分。 – user1188241 2013-03-08 17:52:38

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

當我選擇一個列時,我很熟悉CONVERT和CAST,但是我不知道如何CONVERT或CAST一個子SELECT語句,然後連接這兩個。 – user1188241 2013-03-08 17:31:59

1

您可以執行以下操作使用CASTCONVERT

CONVERT(VARCHAR(20), YourIntColumn) 

OR

CAST(YourIntColumn AS VARCHAR(20)) 
2

做的是有一個case語句被零邏輯來處理鴻溝什麼,不能切換到對於數字數據的字符串。

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

這看起來像它會工作,如果登錄和登錄失敗數據庫列。如何使用我的示例這些工作是從子選擇構建的別名列名稱? – user1188241 2013-03-08 18:01:09

+0

這些值仍然使用子查詢生成。它只是將COUNTs()合併爲一個子查詢,然後有條件地進行登錄。你運行過嗎? – 2013-03-08 19:35:25

0

我想你可以在這裏創建一個外部查詢:

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

這沒有效果 – user1188241 2013-03-08 17:34:48

+0

@ user1188241 - 抱歉。你現在可以嘗試(我改變了一下)併發布確切的錯誤(如果它仍然有問題)? – 2013-03-08 17:52:00

0

我認爲這將這樣的伎倆

Select column1 + '/' + column2 from table1