2015-08-20 1 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

 Смежные вопросы

  • Нет связанных вопросов^_^