【问题标题】:TSQL CASE with if comparison in SELECT statementTSQL CASE 与 SELECT 语句中的 if 比较
【发布时间】:2012-12-23 06:31:48
【问题描述】:

我想在 SELECT 中使用 CASE 语句。

我从用户表中选择,并且(作为一个属性)我还使用嵌套 SQL:

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

然后我想做一个 CASE 语句来获取用户的排名(排名取决于 articleNumber)。

我试过这样:

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

解析没有显示错误,但是当我尝试运行它时出现错误:

消息 207,级别 16,状态 1,过程 GetUserList,行 XY
列名“articleNumber”无效。

我猜,CASE 不能“识别”我的嵌套 SELECT。

我帮助自己解决了一些其他问题,例如 SQL Server 2008 - Case / If statements in SELECT Clause 但似乎没有任何效果。

我也没有发现''比较的任何类似问题。

任何帮助将不胜感激;)

【问题讨论】:

    标签: sql sql-server-2008 tsql select case


    【解决方案1】:

    请在外部选择中选择相同的。您无法在同一查询中访问别名。

    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
    

    【讨论】:

    • 谢谢......我不敢相信我自己没有看到这个 :) 现在解决方案就在眼前,它看起来很简单 :D :D :D
    【解决方案2】:

    应该是:

    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
    

    【讨论】:

    • 感谢您的回答,因为我还需要文章编号,所以此解决方案不适合我。虽然它会引导我找到解决方案,所以我给你打分;)
    • 它给你articleNumber :) 有两个子查询
    【解决方案3】:

    你可以试试这个:

    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
    

    【讨论】:

    • 为什么,如果我上面有更清洁的解决方案。感谢您的努力,但我没有看到任何意义。没有 groupBy 和其他开销 ....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多