2013-03-08 5 views
10

Czekam na konwersję kolumny na ciąg znaków, w którym kolumna jest pozycją select, a następnie dołączenie do innej kolumny. Tutaj pojawia się moje zamieszanie podczas używania CONVERT lub CAST.Konwertuj kolumnę na łańcuch znaków w SQL Wybierz:

Przykład:

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 

Teraz ta kwerenda działa idealnie w to zapewnia prawidłową liczbę logowań i powiodło się jako liczby całkowite. Jednak chcę używać tych liczb całkowitych jako ciąg, więc mogę jedną kolumnę. Jest powód, dla którego musi to być jedna kolumna jako ciąg.

Chcę mieć tylko 4 kolumny, a nie 5. Kolumna logowania, którą chcę mieć, to loginCountFailed/LoginCount. Na przykład: 3/12. Muszę go jako łańcuch bo nie można dzielić przez 0 i nie są czasy, w których mianownik jest 0.

+1

Jaki jest ostateczny wyjście chcesz? Ciąg taki jak '3/12''? Czy rzeczywisty wynik tego podziału, tj. "4"? Czy chcesz tylko ciąg znaków, aby uniknąć błędu dzielenia przez zero? –

Odpowiedz

10

Dla concatanating numery w MSSQL-2005 należy użyć CAST

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

loginsFailed i loginCount powyżej jest faktycznie Twoje select count distinct fragmenty

Mam nadzieję, że to działa

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

Tak, wiem, że używam obsady. Jednak nie mogę uzyskać poprawnej składni podczas korzystania z podkategorii. – user1188241

+0

Dodałem próbkę –

+1

To działa. Widzę, gdzie popełniłem błąd.Przesyłam podpowiedź sub wybierz opcję źle, alias jest tam. To była dla mnie myląca część. – 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

Jestem zaznajomiony z CONVERT i CAST przy wyborze kolumny, jednak nie wiem jak KONWERTOWAĆ lub CAST sub instrukcja Select, a następnie połączyć dwa. – user1188241

1

można wykonać następujące czynności za pomocą CAST lub CONVERT:

CONVERT(VARCHAR(20), YourIntColumn) 

LUB

CAST(YourIntColumn AS VARCHAR(20)) 
2

Co chcesz zrobić, to mieć oświadczenie case do obsługi dzielenia przez zero logiki, nie przełączyć się na sznurku dla danych liczbowych.

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

Wygląda na to, że będzie działał, jeśli logowanie i logowanie zakończy się w przypadku kolumn bazy danych. Jak działałoby to przy użyciu mojego przykładu, czy są to aliasingowe nazwy kolumn zbudowane z sub-selekcji? – user1188241

+0

Te wartości są nadal tworzone przy użyciu podselekcji. Po prostu łączy on COUNTs() w pojedynczą podselekcję, a następnie warunkuje dzielenie pewnych loginów. Czy to uruchomiłeś? –

0

Myślę, że możesz po prostu utworzyć zapytanie zewnętrzne tutaj:

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

To nie zadziałało – user1188241

+0

@ user1188241 - Przepraszam za to. Czy mógłbyś teraz spróbować (trochę to zmieniłem) i opublikować dokładny błąd (jeśli nadal ma problemy)? –

0

myślę, że to załatwi

Select column1 + '/' + column2 from table1