2015-08-20 190 views
1

我被困在一个查询中,我试图获取仅在某个日期范围内新获取的客户信息。查看一个日期范围内的数据并从另一个日期范围计数

我需要获得在一年中前6个月中首次下单的顾客名单。然后,我需要在过去6个月内获得他们的发票,第一张发票日期,最后一张发票日期和订单计数的总计。

我使用了HAVING子句来确保我只查看在6个月期间内放置其第一个订单的客户,但由于我们现在已经过去那段时间,所以总发票信息和订单计数信息将包括已下达订单过了这段时间。我考虑在“最后发票日期”的HAVING条款中加入限制条款,但是我消除了第一个订单日期在6个月内的客户,并且在此之后订购。我不知道下一步该做什么,也没有找到类似问题的运气。这是我到目前为止:

SELECT c.customer, MAX(c.name) AS Name, 
    SUM(
     CASE WHEN im.debit = 0 
     THEN im.amount * -1 
     ELSE im.amount 
     END 
    ) AS TotalInvoiceAmount, 
    MIN(
      im.date) AS FirstInvoiceDate, 
    MAX(
     im.date) AS LastInvoiceDate, 
    COUNT(DISTINCT om.[order]) AS OrderCount 
FROM invoicem im 
INNER JOIN customer c ON im.customer = c.customer 
FULL JOIN orderm om ON im.customer = om.customer 
WHERE im.amount <> 0 
GROUP BY c.customer 
HAVING MIN(im.date) BETWEEN '01-01-2015' AND '06-30-2015' 
ORDER BY c.customer 

回答

1

你可以把前6个月的资格作为子查询。这也将作为一个CTE

declare @startDate date = dateadd(month,-6,getdate()) 

SELECT c.customer, MAX(c.name) AS Name, 
    SUM(
     CASE WHEN im.debit = 0 
     THEN im.amount * -1 
     ELSE im.amount 
     END 
    ) AS TotalInvoiceAmount, 
    MIN(
      im.date) AS FirstInvoiceDate, 
    MAX(
     im.date) AS LastInvoiceDate, 
    COUNT(DISTINCT om.[order]) AS OrderCount 
FROM invoice im 
INNER JOIN (SELECT customer from invoice 
      GROUP BY customer 
      HAVING MIN(date) BETWEEN '01-01-2015' 
      AND '06-30-2015') im2 
ON im.customer = im2.customer 
INNER JOIN customer c ON im.customer = c.customer 
FULL JOIN orderm om ON im.customer = om.customer 
WHERE im.amount <> 0 
AND im.date >= @startdate 
GROUP BY c.customer 
ORDER BY c.customer 
+0

谢谢!虽然我收到了错误,但是它声明:列'invoicem.customer'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 和 无法绑定多部分标识符“c.customer” – DisplayBee

+0

@DisplayBee指的是您的子查询。请参阅编辑 –

+0

谢谢。我仍然遇到c.customer问题。我不明白为什么它不承认,但我仍然在努力学习! – DisplayBee

相关问题