呃,为什么不:
WHERE InvoiceDate >= DATEADD(MONTH, DATEDIFF(MONTH,0,GETDATE())-4, 0)
AND InvoiceDate < DATEADD(MONTH, DATEDIFF(MONTH,0,GETDATE())-3, 0)
最终评估(今天,2013 年 4 月 5 日)为:
WHERE InvoiceDate >= '2012-12-01'
AND InvoiceDate < '2013-01-01'
放入您的查询:
SELECT C.CustId,
[Total0] = SUM(CASE
WHEN InvoiceDate >= DATEADD(MONTH, DATEDIFF(MONTH,0,GETDATE())-4, 0)
AND InvoiceDate < DATEADD(MONTH, DATEDIFF(MONTH,0,GETDATE())-3, 0)
THEN Ia.Amount ELSE 0 END
)
FROM dbo.Invoice AS I
INNER JOIN dbo.InvoiceAmtSummary AS Ia
ON I.GUIDInvoice = Ia.GUIDInvoice
INNER JOIN dbo.Customer AS C
ON C.GUIDCustomer = I.GUIDCustomer
GROUP BY C.CustId;
尽管您可能希望将其放在WHERE
子句中,除非您想包括当月没有销售的客户(似乎将他们排除在外是合乎逻辑的,因为您已经排除了从未有过销售的客户发票)。例如
SELECT C.CustId, Total0 = SUM(Ia.Amount)
FROM dbo.Invoice AS I
INNER JOIN dbo.InvoiceAmtSummary AS Ia
ON I.GUIDInvoice = Ia.GUIDInvoice
INNER JOIN dbo.Customer AS C
ON C.GUIDCustomer = I.GUIDCustomer
WHERE InvoiceDate >= DATEADD(MONTH, DATEDIFF(MONTH,0,GETDATE())-4, 0)
AND InvoiceDate < DATEADD(MONTH, DATEDIFF(MONTH,0,GETDATE())-3, 0)
GROUP BY C.CustId;
无论如何,现在您实际上可以使用 index onInvoiceDate
而不是这种DATEPART(MONTH
不可分割的 hack。
还有一些其他的提示:
说出你的意思。yyyy
当您可以输入YEAR
并且更明确时,为什么要输入?要了解为什么这很重要,请尝试猜测这将返回什么,然后尝试找出为什么它没有按照您的想法执行:
SELECT DATEPART(y, GETDATE());
你的语法不正确。你不能说CASE WHEN (some boolean expression) THEN
- 你必须将它与某物进行比较。CASE
不是布尔构造,它是返回单个结果的表达式。所以你必须评估它,比如CASE WHEN (expression) = 1 THEN
......
请不要使用AS 'alias'
带单引号的语法。如果需要分隔符(在这种情况下不需要),请使用[square brackets]
. 某些形式的别名单引号定界符已被弃用,它们使代码更难阅读,因为它们看起来像字符串文字。
请阅读以下有关日期范围查询的文章: