【问题标题】:CASE Statement SQL Server 2012案例语句 SQL Server 2012
【发布时间】:2015-06-01 07:02:36
【问题描述】:

使用 pubs db,我使用 UNION ALL 创建了以下内容,但尝试使用 CASE stmt 做同样的事情。

SELECT 
t.title_id AS 'Title ID',
t.ytd_sales 'YTD Sales',
t.price AS 'Original Price',
          'New Price' = CASE t.ytd_sales
           WHEN (t.ytd_sales < 2500.00) THEN CONVERT(DECIMAL(9,2),ROUND   (t.price*1.15,2))
           WHEN (t.ytd_sales BETWEEN 2500.00 AND 10000.00) THEN CONVERT(DECIMAL(9,2),ROUND(t.price*1.10,2))
           WHEN (t.ytd_sales > 10000.00) THEN CONVERT(DECIMAL(9,2),ROUND(t.price*1.05,2))
           ELSE CONVERT(DECIMAL(9,2),ROUND(t.price*1.00,2))
        END

    FROM titles t  
    ;

它不喜欢比较/特殊运算符。这甚至可以作为 CASE stmt 吗? 谢谢

【问题讨论】:

标签: sql-server case


【解决方案1】:

正如 Martin Smith 所说,从句法上讲,这个问题与 SQL Server CASE .. WHEN .. expression 重复。

这个查询的正确语法是

SELECT 
t.title_id  AS [Title ID],
t.ytd_sales AS [YTD Sales],
t.price     AS [Original Price],
CASE  
       WHEN (t.ytd_sales < 2500.00) THEN CONVERT(DECIMAL(9,2),ROUND   (t.price*1.15,2))
       WHEN (t.ytd_sales BETWEEN 2500.00 AND 10000.00) THEN CONVERT(DECIMAL(9,2),ROUND(t.price*1.10,2))
       WHEN (t.ytd_sales > 10000.00) THEN CONVERT(DECIMAL(9,2),ROUND(t.price*1.05,2))
       ELSE CONVERT(DECIMAL(9,2),ROUND(t.price*1.00,2))
    END     AS [New Price]

FROM dbo.titles t  
;

冒着被说教的风险:列别名应该放在方括号中(as [Title ID]),而不是单引号(用于字符串文字)。参考:TSQL SELECT Clause

【讨论】:

  • 非常感谢你,Stan - 感谢我能得到的任何和所有方向,因为我是这个东西的新手。感谢您的耐心!
  • 跟进 - 当然你的调整就像一个魅力。再次感谢...我现在看到了我犯的所有错误!
【解决方案2】:

您似乎正试图在 SQL 中混合使用两种样式的 CASE 语句。

SQL Server (Transact-SQL) 中 CASE 语句的语法是:

场景 1:如果您有一个简单的逻辑,其中表达式将与提供的每个值进行比较:

CASE expression

   WHEN value_1 THEN result_1
   WHEN value_2 THEN result_2
   ...
   WHEN value_n THEN result_n

   ELSE result

END

场景 1:当您有更复杂的逻辑并且需要评估不同的条件时:

CASE

   WHEN condition_1 THEN result_1
   WHEN condition_2 THEN result_2
   ...
   WHEN condition_n THEN result_n

   ELSE result

END

礼貌:SQL Server: Case Statement

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多