2011-08-02 21 views
5

Chciałbym wiedzieć, czy w zapytaniu SQL możliwe jest zastąpienie niektórych wartości czymś innym lub czy muszę to zrobić w przetwarzaniu końcowym.Czy można zastąpić wartości w zapytaniu SQL?

Pozwól mi wyjaśnić. Mam poniższej tabeli:

|username| accepted | 
|--------|----------| 
| toto | NULL | 
|--------|----------| 
| foo | 0  | 
|--------|----------| 
| Rick | 1  | 
|--------|----------| 
| bar | 1  | 
|--------|----------| 

Chcę wiedzieć numery rzędzie za wartość accepted (wartości pustych bit). Używam tej kwerendy:

SELECT [accepted], count(*) FROM my_table GROUP BY [accepted] 

które powinny powrócić:

NULL 1 
false 1 
true 2 

Czy istnieje jakiś sposób, aby zastąpić wartości accepted przez bardziej znaczące etykiet? Idealnie chciałbym mieć coś takiego:

not_available 1 
not_accepted 1 
accepted  2 

Czy to możliwe z SQL Server 2008 R2?

Thx.

+0

Alternatywą byłoby, aby aplikacja obsługiwała literały. – niktrs

Odpowiedz

11

Jeśli masz kilka wartości:

SELECT CASE [accepted] 
WHEN 0 THEN 'not_accepted' 
WHEN 1 THEN 'accepted ' 
ELSE 'not_available' END AS accepted 
, count(*) 
FROM my_table 
GROUP BY CASE [accepted] 
WHEN 0 THEN 'not_accepted' 
WHEN 1 THEN 'accepted ' 
ELSE 'not_available' END 
+0

w rzeczywistości pojawia się błąd z warunkiem GROUP BY: "Kolumna" ValidationStats.accepted "jest niepoprawna na liście select, ponieważ nie jest zawarta ani w funkcji agregującej ani w klauzuli GROUP BY". Jednak to działa dobrze po prostu GROUP BY [akceptowane]. – Antoine

+0

Czy możesz opublikować kod? I prowadzona dokładny kod przed przykładowych danych i działa – niktrs

+0

SELECT case [updateaccepted] gdy 0 to „nie przyjął” gdy 1 to „zaakceptowane” indziej „niedostępne” kończy , count (*) OD ValidationStats GROUP BY CASE [updateaccepted] KIEDY 0 Then 'nie zaakceptowane' KIEDY 1 Then 'akceptowane' ELSE 'niedostępne' END – Antoine

1

tak to jest tam ... można zmodyfikować zapytanie jak poniżej -

SELECT decode(accepted,NULL,'not_available' ,1,'accepted',0,'not_accepted'),count(*) 
FROM my_table GROUP BY 
decode(accepted,NULL,'not_available' ,1,'accepted',0,'not_accepted') 

powinno dać wyjście jak chcesz ..

może być funkcja dekodowania nie jest tam wtedy można użyć case tam ..

SELECT 
case accepted 
    WHEN 1 THEN 'accepted' 
    WHEN 0 THEN 'not_accepted' 
    ELSE 'not_available' 
end,count(*) 
    FROM my_table GROUP BY  
case accepted 
    WHEN 1 THEN 'accepted' 
    WHEN 0 THEN 'not_accepted' 
    ELSE 'not_available' end 
+4

dekodowanie nie jest w SQL Server ... – gbn

+1

Serwer SQL AFAIK nie ma DECODE. Ponadto, jako sposób oszczędzania na pisaniu, nie musisz grupować według pełnej DECYZJI, ale tylko Akceptowane, ponieważ relacja input: result wynosi 1: 1. Będziesz musiał GRUPOWA BYĆ w pełnej DEKODE, jeśli dwa lub więcej różnych danych wejściowych mapowane na to samo wyjście. – MatBailie

+1

Czy tylko wyrocznia myślę, że – niktrs

3

Użyj przypadku

SELECT 
    CASE [accepted] 
     WHEN 1 THEN 'accepted' 
     WHEN 0 THEN 'not_accepted' 
     ELSE 'not_available' --NULL 
    END AS [accepted], count(*) 
FROM my_table 
GROUP BY --try [accepted] by itself first 
    CASE [accepted] 
     WHEN 1 THEN 'accepted' 
     WHEN 0 THEN 'not_accepted' 
     ELSE 'not_available' --NULL 
    END 

Być może będziesz musiał użyć całego CASE w GROUP BY. Chyba że robisz to

SELECT 
    CASE [accepted] 
     WHEN 1 THEN 'accepted' 
     WHEN 0 THEN 'not_accepted' 
     ELSE 'not_available' --NULL 
    END AS [accepted], CountOfAccepted 
FROM 
    (SELECT [accepted], count(*) AS CountOfAccepted 
    FROM my_table GROUP BY [accepted]) foo 
+0

Jak zrozumiałem, nie ma potrzeby Syntactic GROUP NA CAŁE oświadczenie CASE.Wymagałoby to tylko funkcjonalności, gdyby dwie lub więcej wartości w polu Zaakceptowano odwzorowane na ten sam ciąg (Aby uniknąć, że łańcuch pojawiał się wiele razy w ostatecznym zestawie wyników). – MatBailie

+0

@Dems: prawdopodobnie, nie pamiętam, kiedy SQL Server gdera na mnie o tym materiale – gbn

+1

@ gbn - dla wersji "foo", jeśli drugi "count (*)" będzie jak "count (*) as count_accepted" , a pierwszy "count (*)" być "count_accepted"? –

2
SELECT 
    CASE [accepted] 
     WHEN 1 THEN 'accepted', 
     WHEN 0 THEN 'not accepted', 
     ELSE 'not available' 
    END AS [accepted], 
    count(*) 
FROM my_table GROUP BY [accepted] 

?

Nie jestem pewien, czy to jest dokładnie to, i nie mam już serwera SQL do przetestowania, ale powinno być coś takiego.

EDYCJA: aww, już opublikowany

Powiązane problemy