SUM与CASE和LEFT语法

时间:2018-01-31 14:32:52

标签: sql sql-server

使用下面的代码,我试图获得2015-2017三年的总Net_ValueEaches。但是我不能,因为我的生活中弄清楚语法错误是什么 [Microsoft][SQL Server Native Client 10.0][SQL Server]Incorrect syntax near '2015'.

SELECT
  SUM(CASE WHEN LEFT(STR(FP_Based_on_Comm_Date),4) = '2015' THEN Net_Value ELSE 0 END) AS 2015Sales,
  SUM(CASE WHEN LEFT(STR(FP_Based_on_Comm_Date),4) = '2016' THEN Net_Value ELSE 0 END) AS 2016Sales,
  SUM(CASE WHEN LEFT(STR(FP_Based_on_Comm_Date),4) = '2017' THEN Net_Value ELSE 0 END) AS 2017Sales,
  SUM(CASE WHEN LEFT(STR(FP_Based_on_Comm_Date),4) = '2015' THEN Eaches ELSE 0 END) AS 2015Eaches,
  SUM(CASE WHEN LEFT(STR(FP_Based_on_Comm_Date),4) = '2016' THEN Eaches ELSE 0 END) AS 2016Eaches,
  SUM(CASE WHEN LEFT(STR(FP_Based_on_Comm_Date),4) = '2017' THEN Eaches ELSE 0 END) AS 2017Eaches

  FROM DB;

字段本身是一个数字字段,我试图将它用作字符串。这些值通常为2015001,格式为yyyymmm

2 个答案:

答案 0 :(得分:4)

问题是您正在使用的列别名 - 有效的SQL Server / T-SQL标识符不能以数字开头。

如果您真的想保留这一点,必须将这些放在方括号中,如下所示:

SELECT
    SUM(CASE 
           WHEN LEFT(FP_Based_on_Comm_Date, 4) = 2015 
              THEN Net_Value 
              ELSE 0 
        END) AS [2015Sales],

,您需要将其应用于所有列别名。

答案 1 :(得分:0)

假设您的日期存储为日期,为什么不使用YEAR()功能。我还建议将年份放在列别名的末尾。

SELECT SUM(CASE WHEN YEAR(FP_Based_on_Comm_Date) = 2015 THEN Net_Value ELSE 0 END) AS Sales_2015

我认为使用需要转义的标识符是个坏主意 - 它们只会使查询更难以编写和阅读。

而且,如果您只关心结果,为什么不使用GROUP BY

select year(FP_Based_on_Comm_Date), sum(net_value) as sales, sum(eaches) as eaches
from db
group by year(FP_Based_on_Comm_Date),
order by year(FP_Based_on_Comm_Date);