SQL Server中的最后订单日期和年初至今的销售

时间:2018-10-18 18:34:58

标签: sql-server tsql

我有两个表:

客户

CUSTNUM
STATUS (1 inactive, 2 active)
CUSTNAME

发票

INVNUM
INVDATE
INVTOTAL
CUSTNUM

我希望获得现有客户的年初至今总销售额,这些客户的数量以00结尾和最后发票日期(可能是过去的任何时间,而不仅仅是去年)。基本上,如果最后一次购买是在2018年之前,则总列中将没有任何内容。我无法获得总计信息,也无法显示今年未购买任何商品的客户。谢谢您的帮助!

SELECT 
    BP.CUSTNUM, BP.STATUS, BP.CUSTNAME, 
    MAX(SI.INVDATE), SUM(SI2.INVTOTAL)
FROM 
    dbo.CUSTOMERS AS BP
LEFT JOIN 
    dbo.INVOICES AS SI ON BP.CUSTNUM = SI.CUSTNUM
LEFT JOIN 
    dbo.INVOICES AS SI2 ON BP.CUSTNUM = SI2.CUSTNUM
WHERE 
    BP.STATUS= 2 
    AND BP.CUSTNUM LIKE '%00'
    AND SI2.INVDATE BETWEEN '01/01/2018' AND '10/18/2018'
GROUP BY 
    BP.CUSTNUM, BP.STATUS, BP.CUSTNAME 
ORDER BY 
    BP.CUSTNUM

1 个答案:

答案 0 :(得分:0)

正如@Sean所评论的那样,where上的InvDate子句会将联接转换为inner join,这就是为什么它不显示今年未购买任何商品的客户的原因。同样,您不必两次连接同一张表即可获得Max InDate和条件SUM。您可以使用CASE表达式根据InvDate上的条件计算总数,如下所示。

SELECT 
    BP.CUSTNUM, 
    BP.STATUS, 
    BP.CUSTNAME, 
    MAX(SI.INVDATE), 
    SUM(CASE WHEN YEAR(SM.INVDATE) = 2018 THEN SI.INVTOTAL ELSE 0 END) AS YTD_INVTOTAL
FROM 
    dbo.CUSTOMERS AS BP
LEFT JOIN 
    dbo.INVOICES AS SI ON BP.CUSTNUM = SI.CUSTNUM
WHERE 
    BP.STATUS= 2 
    AND BP.CUSTNUM LIKE '%00'
GROUP BY 
    BP.CUSTNUM, BP.STATUS, BP.CUSTNAME 
ORDER BY 
    BP.CUSTNUM