web-dev-qa-db-fra.com

Convertir une colonne en chaîne dans SQL Select

Je cherche à convertir une colonne en chaîne où la colonne est une instruction select, puis concat avec une autre colonne. C’est là que ma confusion se produit lors de l’utilisation de CONVERT ou CAST.

Exemple:

 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

Désormais, cette requête fonctionne parfaitement car elle fournit le nombre correct de connexions et échoue sous forme d’entiers. Cependant, je veux utiliser ces entiers comme une chaîne afin que je puisse une colonne. Il y a une raison pour laquelle il doit s'agir d'une colonne sous forme de chaîne.

Je veux avoir seulement 4 colonnes, pas 5. La colonne de connexion que je veux avoir est loginCountFailed/LoginCount. Par exemple: 3/12. J'en ai besoin sous forme de chaîne, car vous ne pouvez pas diviser par 0 et le dénominateur est parfois égal à 0.

10
user1188241

Pour concatater des nombres dans MSSQL-2005, vous devez utiliser CAST

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

loginsFailed et loginCount ci-dessus sont en réalité vos fragments select count distinct

J'espère que ça marche

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))
11
Serkan Arıkuşu

Ce que vous voulez faites, c'est d'avoir une instruction de casse pour gérer la logique de division par zéro, et non de passer à une chaîne pour des données numériques.

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
2
Kyle Hale
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))

La source

2
Woot4Moo

Vous pouvez effectuer les opérations suivantes en utilisant CAST ou CONVERT:

CONVERT(VARCHAR(20), YourIntColumn)

OR

CAST(YourIntColumn AS VARCHAR(20))
1
Praveen Nambiar

Je pense que vous pouvez simplement créer une requête externe ici:

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
PM 77-1

Je pense que ça va faire l'affaire

Select column1 + '/' + column2 from table1
0
Ajo Koshy