2013-03-08 15 views
10

Sto cercando di convertire una colonna in stringa in cui la colonna è una selezione di stato e quindi concatena con un'altra colonna. Questo è dove la mia confusione si verifica quando si utilizza CONVERT o CAST.Converti colonna in stringa in SQL Selezionare

Esempio:

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 

Ora, questa query funziona perfettamente nel cioè fornisce il numero corretto di login e fallito come numeri interi. Tuttavia, voglio usare questi numeri interi come una stringa in modo che io possa una colonna. C'è una ragione per cui questa deve essere una colonna come stringa.

Voglio avere solo 4 colonne, non 5. La colonna di login che voglio avere è loginCountFailed/LoginCount. Ad esempio: 3/12. Ne ho bisogno come una stringa perché non si può dividere per uno 0 e ci sono momenti in cui il denominatore è 0.

+1

Qual è l'output finale che si desidera? Una stringa come "3/12"? O il risultato effettivo di quella divisione, ad esempio '4'? Vuoi solo una stringa per evitare un errore di divisione per zero? –

risposta

10

Per concatanating numeri in MSSQL-2005 si dovrebbe usare CAST

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

loginsFailed e logincount sopra è in realtà i vostri select count distinct frammenti

Spero che questo funziona

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

Sì, so usare il cast. Tuttavia, non riesco a ottenere la sintassi corretta quando si utilizzano i sub-select. – user1188241

+0

Ho aggiunto un campione –

+1

Questo funziona. Posso vedere dove stavo facendo l'errore.Stavo lanciando la sottosezione di selezione secondaria errata con l'alias che era lì dentro. Questa è stata la parte confusa per me. – 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

Sono familiare con CONVERT e CAST quando si seleziona una colonna, tuttavia non so come convertire o eseguire il cast di un'istruzione sub Select e quindi concatenare i due. – user1188241

1

È possibile effettuare le seguenti operazioni utilizzando CAST o CONVERT:

CONVERT(VARCHAR(20), YourIntColumn) 

O

CAST(YourIntColumn AS VARCHAR(20)) 
2

Che cosa si vuole fare è avere un'istruzione case per gestire dividere per zero logico, non passare a una stringa per i dati numerici.

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

Sembra che funzionerà se login e loginsfailed dove colonne del database. Come funzionerebbe usando il mio esempio questi sono nomi di colonne con alias costruiti da sottoelementi? – user1188241

+0

Questi valori sono ancora creati utilizzando la sottoselezione. Combina semplicemente i COUNT() in una singola sottoselezione e quindi esegue la divisione in modo condizionale con alcuni accessi. L'hai eseguito? –

0

Penso che puoi semplicemente creare una query esterna qui:

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

Questo non ha funzionato – user1188241

+0

@ user1188241 - Mi dispiace per quello. Potresti provare ora (l'ho cambiato un po ') e postare l'errore esatto (se ha ancora problemi)? –

0

penso che questo farà il trucco

Select column1 + '/' + column2 from table1