我有两个表:
客户
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
答案 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