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.
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))
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
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))
Vous pouvez effectuer les opérations suivantes en utilisant
CAST
ouCONVERT
:
CONVERT(VARCHAR(20), YourIntColumn)
OR
CAST(YourIntColumn AS VARCHAR(20))
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
Je pense que ça va faire l'affaire
Select column1 + '/' + column2 from table1