使用下面的代码,我试图获得2015-2017三年的总Net_Value
和Eaches
。但是我不能,因为我的生活中弄清楚语法错误是什么
[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
答案 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);