Преобразование столбца в строку в SQL Select

Я хочу преобразовать столбец в строку, где столбец является выбранным статусом, а затем конкатена с другим столбцом. Вот где моя путаница возникает при использовании CONVERT или CAST.

Пример:

 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

Для конкатенации чисел в MSSQL-2005 вы должны использовать 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))

Ответ 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))

Источник

Ответ 3

Что вам нужно хотеть, так это иметь оператор 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

Ответ 4

Вы можете сделать следующее, используя CAST или CONVERT:

CONVERT(VARCHAR(20), YourIntColumn)

ИЛИ

CAST(YourIntColumn AS VARCHAR(20))

Ответ 5

Я думаю, вы можете просто создать внешний запрос здесь:

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

Ответ 6

Я думаю, что это сделает трюк

Select column1 + '/' + column2 from table1