it-swarm.com.de

TSQL CASE mit if-Vergleich in der SELECT-Anweisung

Ich möchte die CASE-Anweisung in SELECT verwenden.

Ich wähle aus Benutzertabelle aus und verwende (als ein Attribut) auch verschachteltes SQL:

SELECT 
   registrationDate, 
   (SELECT COUNT(*) FROM Articles WHERE userId = Users.userId) as articleNumber, 
   hobbies, ...
FROM USERS

und dann möchte ich eine CASE-Anweisung machen, um den Rang des Benutzers zu ermitteln (Rang ist abhängig von der Artikelnummer).

Ich habe es so versucht:

SELECT 
   registrationDate, 
   (SELECT COUNT(*) FROM Articles WHERE Articles.userId = Users.userId) as articleNumber, 
   ranking =
      CASE
         WHEN articleNumber < 2 THEN 'AMA'
         WHEN articleNumber < 5 THEN 'SemiAma' 
         WHEN articleNumber < 7 THEN 'Good'  
         WHEN articleNumber < 9 THEN 'Better' 
         WHEN articleNumber < 12 THEN 'Best'
         ELSE 'Outstanding'
      END,
   hobbies, etc...
FROM USERS

Beim Parsen wird kein Fehler angezeigt, aber wenn ich versuche, es auszuführen, erhalte ich einen Fehler:

Msg 207, Ebene 16, Status 1, Prozedur GetUserList, Zeile XY
Ungültiger Spaltenname 'ArtikelNummer'.

Ich glaube, CASE "erkennt" mein verschachteltes SELECT nicht.

Ich habe mir mit anderen Lösungen geholfen, wie SQL Server 2008 - Case/If-Anweisungen in SELECT-Klausel Aber nichts scheint zu funktionieren.

Ich habe auch kein vergleichbares Problem mit dem Vergleich von "<" und ">" gefunden.

Jede Hilfe wäre sehr dankbar;)

36
CyberHawk

Bitte wählen Sie dasselbe in der äußeren Auswahl. Sie können nicht auf den Aliasnamen in derselben Abfrage zugreifen.

SELECT *, (CASE
        WHEN articleNumber < 2 THEN 'AMA'
        WHEN articleNumber < 5 THEN 'SemiAma' 
        WHEN articleNumber < 7 THEN 'Good'  
        WHEN articleNumber < 9 THEN 'Better' 
        WHEN articleNumber < 12 THEN 'Best'
        ELSE 'Outstanding'
        END) AS ranking 
FROM(
    SELECT registrationDate, (SELECT COUNT(*) FROM Articles WHERE Articles.userId = Users.userId) as articleNumber, 
    hobbies, etc...
    FROM USERS
)x
47
TechDo

Sollte sein:

SELECT registrationDate, 
       (SELECT CASE
        WHEN COUNT(*)< 2 THEN 'AMA'
        WHEN COUNT(*)< 5 THEN 'SemiAma' 
        WHEN COUNT(*)< 7 THEN 'Good'  
        WHEN COUNT(*)< 9 THEN 'Better' 
        WHEN COUNT(*)< 12 THEN 'Best'
        ELSE 'Outstanding'
        END as a FROM Articles 
        WHERE Articles.userId = Users.userId) as ranking,
        (SELECT COUNT(*) 
        FROM Articles 
        WHERE userId = Users.userId) as articleNumber,
hobbies, etc...
FROM USERS
7
Justin

Sie können es versuchen: 

WITH CTE_A As (SELECT COUNT(*) as articleNumber,A.UserID  as UserID FROM Articles A
           Inner Join Users U
           on  A.userId = U.userId 
           Group By A.userId , U.userId   ),

B as (Select us.registrationDate,

      CASE
         WHEN CTE_A.articleNumber < 2 THEN 'AMA'
         WHEN CTE_A.articleNumber < 5 THEN 'SemiAma' 
         WHEN CTE_A.articleNumber < 7 THEN 'Good'  
         WHEN CTE_A.articleNumber < 9 THEN 'Better' 
         WHEN CTE_A.articleNumber < 12 THEN 'Best'
         ELSE 'Outstanding'
         END as Ranking,
         us.hobbies, etc...
         FROM USERS Us Inner Join CTE_A 
         on CTE_A.UserID=us.UserID)

Select * from B
0
Dia Agha